第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將函數(shù)作為 go 例程調(diào)用會產(chǎn)生與 go 例程不同的調(diào)用堆棧,作為匿名 func

將函數(shù)作為 go 例程調(diào)用會產(chǎn)生與 go 例程不同的調(diào)用堆棧,作為匿名 func

Go
翻翻過去那場雪 2022-08-01 11:10:16
我有一個名為PrintCaller()的函數(shù),它調(diào)用運(yùn)行時(shí)。Caller() 并跳過一幀以獲取和打印調(diào)用方(PrintCaller 的)文件名和行號。當(dāng)同步運(yùn)行時(shí),如果作為匿名函數(shù)調(diào)用異步,則按預(yù)期工作。但是,如果僅使用關(guān)鍵字運(yùn)行,則調(diào)用方的堆棧幀將替換為某些內(nèi)部函數(shù)調(diào)用。go例如,這是函數(shù):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: 19Filename: /tmp/sandbox297971268/prog.go, line: 22Filename: /usr/local/go-faketime/src/runtime/asm_amd64.s, line: 1374此處的工作示例:https://play.golang.org/p/Jv21SVDY2Ln為什么當(dāng)我打電話時(shí)會發(fā)生這種情況,而當(dāng)我打電話時(shí)卻不會發(fā)生這種情況?另外,有沒有辦法使用?go PrintCaller()go func(){PrintCaller()}()go PrintCaller()
查看完整描述

1 回答

?
holdtom

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


查看完整回答
反對 回復(fù) 2022-08-01
  • 1 回答
  • 0 關(guān)注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號