golang 获取调用者的方法名及所在源码行数
目录
golang获取调用者的方法名及所在源码行数
背景
为什么要获取调用者的信息?
典型场景:
✅ 日志记录时自动添加代码位置
✅ 追踪函数调用链路排查BUG
✅ 实现通用埋点监控工具
实现
使用 go 的标准库函数runtime.Caller
func GetCallerInfo() (funcName, file string, line int) {
skip:=1
pc, file, line, ok := runtime.Caller(skip)
if !ok{
// TODO
}
funcName = runtime.FuncForPC(pc).Name()
return
}
// 调用示例
func main() {
name, file, line := GetCallerInfo()
fmt.Printf("Caller: %s %s:%d", name, file, line)
}
当其他代码调用 GetCallerInfo 时,就会会调用者所在的方法名、文件地址、所在行好
参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,….
返回值:
pc是uintptr这个返回的是函数指针
file是函数所在文件名目录
line所在行号
ok 是否可以获取到信息
注意⚠️:runtime.Caller 的通过不断迭代的方法获取信息,存在性能问题
如果是需要打印日志:可以使用开源日志库:GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go.
如果只是需要打印错误err日志堆栈:可以将 error 库替换为 pkg err,参考:go 打印错误日志堆栈