我有一个名为PrintCaller()的函数,它调用运行时。Caller() 并跳过一帧以获取和打印调用方(PrintCaller 的)文件名和行号。当同步运行时,如果作为匿名函数调用异步,则按预期工作。但是,如果仅使用关键字运行,则调用方的堆栈帧将替换为某些内部函数调用。go
例如,这是函数:
func printCaller(wait chan bool) {
_, fileName, line, _ := runtime.Caller(1)
fmt.Printf("Filename: %s, line: %d\n", fileName, 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()
holdtom