如何获取当前的函数名称

时间:2014-09-19 06:28:31

标签: go

出于追踪目的,我想打印出当前的函数名称,例如gcc中的__FUNCTION__宏。

这样当我有一个功能时

func foo () {
   trace()
}

它会自动打印Entering foo()...或类似的东西。

3 个答案:

答案 0 :(得分:54)

套餐runtime是您的朋友:

func trace() {
    pc := make([]uintptr, 10)  // at least 1 entry needed
    runtime.Callers(2, pc)
    f := runtime.FuncForPC(pc[0])
    file, line := f.FileLine(pc[0])
    fmt.Printf("%s:%d %s\n", file, line, f.Name())
}

答案 1 :(得分:21)

对于那些在2017年查看这个问题的人,我们添加了一些golang运行时函数,这些函数似乎可以处理打印的错误行号。

func trace2() {
    pc := make([]uintptr, 15)
    n := runtime.Callers(2, pc)
    frames := runtime.CallersFrames(pc[:n])
    frame, _ := frames.Next()
    fmt.Printf("%s,:%d %s\n", frame.File, frame.Line, frame.Function)
}

游乐场:https://play.golang.org/p/z2kHQJoeUo

答案 2 :(得分:3)

这是一个更简单的版本,不需要分配数组。

func trace() (string, int, string) {
    pc, file, line, ok := runtime.Caller(1)
    if !ok { return "?", 0, "?" }

    fn := runtime.FuncForPC(pc)
    return file, line, fn.Name()
}