1 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個贊
您看到的輸出是人們所期望的,考慮到Go運(yùn)行時(shí)系統(tǒng)的內(nèi)部工作原理:
一個 goroutine,例如在包中調(diào)用你自己的主函數(shù),但也包括 由 啟動的例程,實(shí)際上是從一些特定于機(jī)器的啟動例程調(diào)用的。在操場上,那是.mainmaingo somefunc()src/runtime/asm_amd64.s
定義閉包時(shí),例如:
f := func() {
// code
}
這將創(chuàng)建一個匿名函數(shù)。稱呼它:
f()
從調(diào)用方所在的任何位置調(diào)用該匿名函數(shù)。無論閉包是分配給變量(如上所示),還是立即調(diào)用,或者稍后使用 ,或者其他什么,都是如此:fdefer
defer func() {
// code ...
}()
所以,寫:
go func() {
// code ...
}()
只需從同一個特定于計(jì)算機(jī)的啟動調(diào)用此處的匿名函數(shù)即可。如果該函數(shù)隨后調(diào)用您的函數(shù)(該函數(shù)用于跳過函數(shù)并查找其調(diào)用方),它將找到匿名函數(shù):printCallerruntime.Caller(1)printCaller
Filename: /tmp/sandbox297971268/prog.go, line: 22
例如。
但是當(dāng)你寫:
go printCaller()
您正在調(diào)用從特定于計(jì)算機(jī)的 goroutine 啟動代碼命名的函數(shù)。printCaller
由于打印其調(diào)用方的名稱(即此特定于計(jì)算機(jī)的啟動代碼),因此這就是您所看到的。printCaller
這里有一個很大的警告,那就是允許失敗。這就是為什么它返回一個布爾值和值。無法保證可以找到特定于計(jì)算機(jī)的程序集調(diào)用方。runtime.Callerokpc uintptr, file string, line int
- 1 回答
- 0 關(guān)注
- 122 瀏覽
添加回答
舉報(bào)