golang获取调用者的方法名及所在源码行数

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 打印错误日志堆栈