将函数作为 go 例程调用会产生与作为匿名函数的 go 例程不同的调用堆栈

问题描述

我有一个名为 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 (将#修改为@)