1 回答
TA贡献1805条经验 获得超10个赞
您看到的输出是人们所期望的,考虑到Go运行时系统的内部工作原理:
一个 goroutine,例如在包中调用你自己的主函数,但也包括 由 启动的例程,实际上是从一些特定于机器的启动例程调用的。在操场上,那是.mainmaingo somefunc()src/runtime/asm_amd64.s
定义闭包时,例如:
f := func() {
// code
}
这将创建一个匿名函数。称呼它:
f()
从调用方所在的任何位置调用该匿名函数。无论闭包是分配给变量(如上所示),还是立即调用,或者稍后使用 ,或者其他什么,都是如此:fdefer
defer func() {
// code ...
}()
所以,写:
go func() {
// code ...
}()
只需从同一个特定于计算机的启动调用此处的匿名函数即可。如果该函数随后调用您的函数(该函数用于跳过函数并查找其调用方),它将找到匿名函数:printCallerruntime.Caller(1)printCaller
Filename: /tmp/sandbox297971268/prog.go, line: 22
例如。
但是当你写:
go printCaller()
您正在调用从特定于计算机的 goroutine 启动代码命名的函数。printCaller
由于打印其调用方的名称(即此特定于计算机的启动代码),因此这就是您所看到的。printCaller
这里有一个很大的警告,那就是允许失败。这就是为什么它返回一个布尔值和值。无法保证可以找到特定于计算机的程序集调用方。runtime.Callerokpc uintptr, file string, line int
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报