问题描述
我有一个名为 PrintCaller() 的函数,它调用 runtime.Caller() 并跳过一帧来获取和打印调用者(PrintCaller 的)文件名和行号。这在同步运行时按预期工作,如果作为匿名函数调用异步。但是,如果仅使用 go
关键字运行,则调用者的堆栈帧将替换为某些内部函数调用。
例如,这是函数:
func printCaller(wait chan bool) {
_,fileName,line,_ := runtime.Caller(1)
fmt.Printf("Filename: %s,line: %d\n",line)
}
如果我打电话是这样的:
func main() {
printCaller()
go func(){printCaller()}()
go printCaller()
}
输出为:
Filename: /tmp/sandbox297971268/prog.go,line: 19
Filename: /tmp/sandbox297971268/prog.go,line: 22
Filename: /usr/local/go-faketime/src/runtime/asm_amd64.s,line: 1374
此处的工作示例:https://play.golang.org/p/Jv21SVDY2Ln
为什么当我调用 go PrintCaller()
时会发生这种情况,而当我调用 go func(){PrintCaller()}()
时不会发生这种情况?另外,有什么办法可以使用 go PrintCaller()
来完成这项工作吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)