目录

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