首页 > 编程语言 >分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗

分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗

时间:2024-03-26 16:35:35浏览次数:19  
标签:__ 行号 编译器 源码 file go 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

  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.

标签:__,行号,编译器,源码,file,go,line,runtime
From: https://www.cnblogs.com/ahfuzhang/p/18096998

相关文章

  • 【论文和源码解读】Scaling on Scales:When Do We Not Need Larger Vision Models?
    文章目录0.问题和想法1.观察和见解2.设计和框架2.1关键设计2.2模型框架3.源码解析3.1utils.py文件3.2core.py文件3.2.1forward函数中输入参数的含义3.2.2forward函数的处理逻辑4.消融实验5.未来可能的改进方向原文地址:https://arxiv.org/abs/2403.......
  • 【附源码】Node.js毕业设计个人健康信息记录移动应用app(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着科技的进步和互联网的普及,移动应用已经成为人们日常生活中不可或缺的一部分。在健康管理领域,个人健康信息记录移动应用APP的开发和应用也日益受到关注......
  • 【附源码】Node.js毕业设计个人健康管理小助手(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会节奏的加快和工作压力的增大,个人健康管理成为了人们日益关注的焦点。传统的健康管理方式往往需要用户手动记录健康数据,如饮食、运动、睡眠等,然后进......
  • 【附源码】Node.js毕业设计个人财务管理系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着经济的快速发展和人们生活水平的提高,个人财务管理已经成为了我们生活中不可或缺的一部分。无论是日常生活的消费记录、投资理财,还是购房、购......
  • 【MATLAB源码-第15期】基于matlab的MSK的理论误码率与实际误码率BER对比仿真,采用差分
    操作环境:MATLAB2022a1、算法描述在数字调制中,最小频移键控(Minimum-ShiftKeying,缩写:MSK)是一种连续相位调制的频移键控方式,在1950年代末和1960年代产生。[1]与偏移四相相移键控(OQPSK)类似,MSK同样将正交路基带信号相对于同相路基带信号延时符号间隔的一半,从而消除了已调信号......
  • 【MATLAB源码-第16期】基于matlab的MSK定是同步仿真,采用gardner算法和锁相环。
    操作环境:MATLAB2022a1、算法描述**锁相环(PLL)**是一种控制系统,用于将一个参考信号的相位与一个输入信号的相位同步。它在许多领域中都有应用,如通信、无线电、音频、视频和计算机系统。锁相环通常由以下几个关键组件组成:1.**相位比较器(PhaseComparator):**这个组件比较输......
  • 《Android Framework源码解析》全网最详尽的Android系统框架层的指南,不容错过!!
    前言在当今数字化时代,移动应用已成为我们日常生活中不可或缺的一部分。随着技术的不断进步,Android作为全球领先的移动操作系统,其市场份额和影响力持续扩大。开发者们面临着一个充满活力且竞争激烈的市场环境,用户对应用的体验和性能要求日益提高。在这样的背景下,深入了解And......
  • Tomcat源码解析(二)
     1.项目源码结构2.Tomcat源码结构 1.在javax中保存的是新的JavaEE规范。可以具体来看看每个目录的作用。模块作用说明annotationannotation这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解ejbejb是个古老的传说,我们不管el在jsp中......
  • java计算机毕业设计(附源码)新知书店(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:新知书店,作为一家专注于传播知识和文化的零售场所,承载着促进社会文化发展和满足人们精神需求的重要使命。在数字化时代背景下,实体书店面临着前所未有的挑......
  • 智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端
    智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最线实现项目对人、机、料、法、环的全方位实时监控。支持多端展示(大屏、PC端、手机端、平板......