码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 分享一个项目:go `file_line`,在编译期得到源码行号,减少运行期runtime消耗


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

    • cnblogs博客
    • zhihu
    • Github
    • 公众号:一本正经的瞎扯

    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来得到源码行号。

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

    func SourceCodeLoc(callDepth int) string {
    _, file, line, ok := runtime.Caller(callDepth)
    if !ok {
    return ""
    }
    file = strings.ReplaceAll(file, "\\", "/")
    arr := strings.Split(file, "/")
    if len(arr) > 3 {
    file = strings.Join(arr[len(arr)-3:], "/")
    }
    return fmt.Sprintf("%s:%d", file, line)
    }
    func example(){
    Mylogger.Infof("[%s]something happens here", SourceCodeLoc(1))
    }

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

    How to use

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

    Have Fun. 😃

  • 相关阅读:
    Red Hat 8 安装Docker返回找不到镜像的问题(Status code: 404)
    线程之线程池
    python字典合并的使用注意
    java基于微信小程序的灯具销售商城 uniapp小程序
    IDEA调试出现JDWP No transports initialized错误
    JavaScript运行机制与实践应用
    Python笔记 · 魔法函数 / Magic Methods / Dunder Methods
    基于opencv的实时停车地点查找
    MySQL开机无法启动,需手动启动才可以。
    2-推荐系统之机器学习基础
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/18096998
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号