经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
分享一个项目:go `file_line`,在编译期得到源码行号,减少运行期runtime消耗
来源:cnblogs  作者:ahfuzhang  时间:2024/3/27 8:42:44  对本文有异议

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


file_line

https://github.com/ahfuzhang/file_line

Like __FILE__/__LINE__ of C: use go generate to get source code line number at compile time.
像 C 语言里面的 __FILE__/__LINE__ 宏一样:在编译期,通过 go generate来得到源码行号。

我通常使用下面这个函数来获取源码的行号:

  1. func SourceCodeLoc(callDepth int) string {
  2. _, file, line, ok := runtime.Caller(callDepth)
  3. if !ok {
  4. return ""
  5. }
  6. file = strings.ReplaceAll(file, "\\", "/")
  7. arr := strings.Split(file, "/")
  8. if len(arr) > 3 {
  9. file = strings.Join(arr[len(arr)-3:], "/")
  10. }
  11. return fmt.Sprintf("%s:%d", file, line)
  12. }
  13. func example(){
  14. Mylogger.Infof("[%s]something happens here", SourceCodeLoc(1))
  15. }

这里的 runtime.Caller() 实在程序运行期间去计算程序对应的源码行的,必然会带来性能损耗。
这种需求完全可以在编译期间实现,最终我发现使用 go ast 库能够简单的达成这一功能。

How to use

  1. 安装:
  1. go install github.com/ahfuzhang/file_line@latest
  1. 编写代码,在需要使用行号的地方使用这样的place holder:
  1. func myCode(){
  2. Mylogger.Infof(“%s: something happens here”, “[file.go:123]")
  3. }
  1. 在程序的入口出加上 go generate指令:
  1. //go:generate file_line -src=./
  2. func main() {
  3. fmt.Println("use a place holder:", "[file.go:123]")
  4. }
  1. 在编译前执行 go generate
  • 所有的处于函数调用参数位置的 place holder 会被替换为正确的文件名和行号
  • 也可以直接在命令行执行 file_line -src=./
  1. 执行 go build

Have Fun. ??

原文链接:https://www.cnblogs.com/ahfuzhang/p/18096998

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号