分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗
作者:张富春(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
来得到源码行号。
我通常使用下面这个函数来获取源码的行号:
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
- 安装:
go install github.com/ahfuzhang/file_line@latest
- 编写代码,在需要使用行号的地方使用这样的place holder:
func myCode(){
Mylogger.Infof(“%s: something happens here”, “[file.go:123]")
}
- 在程序的入口出加上 go generate指令:
//go:generate file_line -src=./
func main() {
fmt.Println("use a place holder:", "[file.go:123]")
}
- 在编译前执行
go generate
- 所有的处于函数调用参数位置的 place holder 会被替换为正确的文件名和行号
- 也可以直接在命令行执行 file_line -src=./
- 执行
go build
。
Have Fun.
分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗的更多相关文章
- 分享一个与ABP配套使用的代码生成器源码
点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...
- 分享一个难得的YiBo微博客户端应用源码Android版
今天给大家分享一款,YiBo微博客户端应用源码,这是一款专为Android用户打造的聚合型微博客户端,完美支持新浪微博.腾讯微博.搜狐微博.网易微博和饭否五个微博平台,界面清爽,使用简单轻巧,支持多账 ...
- 【整站源码分享】分享一个JFinal3.4开发的整站源码,适合新手学习
分享这个源码是14年开发上线的<威海创业者>站点的全套整站源码,前后端都在一个包里.当时开发使用的是JFinal1.4,最近改成了JFinal3.4.使用的JSP做的页面.有一定的参考价值 ...
- 阅读源码很重要,以logback为例,分享一个小白都能学会的读源码方法
作为一个程序员,经常需要读一些开源项目的源码.同时呢,读源码对我们也有很多好处: 1.提升自己 阅读优秀的代码,第一可以提升我们自身的编码水平,第二可以开拓我们写代码的思路,第三还可能让我们拿到大厂 ...
- 分享一个基于web的满意度调查问卷源码系统
问卷调查系统应用于各行各业,对于企业的数据回收统计分析战略决策起到至关作用.而现有的问卷调查系统大都是在线使用并将数据保存在第三方服务器上.这种模式每年都要缴纳费用并且数据安全性得不到保证.所以说每个 ...
- 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了
一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...
- 《淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树》
淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树 曾经的学渣 2014-06-05 18:38:00 浏览1455 云数据库Oceanbase OceanBase是 ...
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划
淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划
body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为 ...
- 整合了一个功能强大完善的OA系统源码,php全开源 界面漂亮美观
整合了一个功能强大完善的OA系统源码,php全开源界面漂亮美观.需要的同学联系Q:930948049
随机推荐
- BasicSample项目说明
整个示例项目,两个Fragment,ProductListFragment和ProductFragment,一个MainActivity.在MainActivity里面展示的是ProductListF ...
- 端口碰撞Port Knocking和单数据包授权SPA
端口碰撞技术 Port knocking 从网络安全的角度,服务器开启的端口越多就越不安全,因此系统安全加固服务中最常用的方式,就是先关闭无用端口,再对提供服务的端口做访问控制.而作为远程管理与维护的 ...
- Swoole从入门到入土(1)——入坑
入坑一个话题,总得有入坑的理由.有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了. 话说Swoole诞生之 ...
- Linux实现指定用户sftp传输,静止ssh登录
1.环境 名称 ip server 192.168.1.1 client 192.168.1.2 2.服务器创建repl用户 useradd -m -d /home/repl -s /usr/sbin ...
- SpringCloud 注册中心Consul实战
介绍 Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色.轻量级的特点.Consul是分布式的.高可用的. 可 ...
- 我的小程序之旅九:微信开放平台unionId机制介绍
一.机制说明 参考文档:https://developers.weixin.qq.com/minigame/dev/guide/open-ability/union-id.html 如果开发者拥有多个 ...
- win32 - 使用VerQueryValue获得应用程序的名称
比如: Google Chrome: 类似于任务管理器中显示名字,见下图 那么我们就需要使用VerQueryValue, 从指定的版本信息资源中检索指定的版本信息.若要检索适当的资源,在调用VerQu ...
- 【Android 逆向】【ARM汇编】 函数的栈帧
1. 函数的调用约定 ARM32 参数1-4 放入r0-r3 剩下的入栈,函数返回值放入r0 ARM64 参数1-8 放入X0-X7 剩下的入栈,函数返回值放入X0 (浮点数是放入 Dn 或 Sn) ...
- Hi3516开发笔记(八):Hi3516虚拟机交叉开发环境搭建之配置QtCreator开发交叉编译环境
海思开发专栏 上一篇:<Hi3516开发笔记(七):Hi3516虚拟机交叉开发环境搭建之交叉编译Qt>下一篇:<Hi3516开发笔记(九):在QtCreator开发环境中引入海思sd ...
- ASP.NET 上传文件导入Excel
前言 本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中.截图如下: 代码实战 工具类 实体类:XMLReadModel.cs public class XMLReadMod ...