出于追踪目的,我想打印出当前的函数名称,例如gcc中的__FUNCTION__
宏。
这样当我有一个功能时
func foo () {
trace()
}
它会自动打印Entering foo()...
或类似的东西。
答案 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)
}
答案 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()
}