首頁 > 後端開發 > Golang > Goroutine 中呼叫的函數的回傳值會發生什麼情況?

Goroutine 中呼叫的函數的回傳值會發生什麼情況?

Mary-Kate Olsen
發布: 2024-12-06 07:49:14
原創
816 人瀏覽過

What Happens to the Return Values of Functions Called within Goroutines?

從 Goroutines 回傳值會發生什麼事?

當從 Goroutine 呼叫函數時,傳回值通常會遺失,因為 Goroutines 有自己的隔離執行環境。雖然函數可以將其傳回值儲存在堆疊上,但該堆疊與主程式的堆疊是分開的,並且當 goroutine 退出時會被銷毀。

函數傳回值分析

使用-gcflags -S 標誌檢查getNumber 函數的彙編輸出,發現它確實將其傳回值儲存在stack:

"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0
    0x0000 00000 (z.go:5)   TEXT    "".getNumber+0(SB),4,<pre class="brush:php;toolbar:false">func getNumber(i int) int {
    return i
}

func main() {
    for i := 0; i < 10; i++ {
        go printNumber(i)
    }
    time.Sleep(5)
}
登入後複製
-16 0x0000 00000 (z.go:6) MOVQ "".i+8(FP),BX 0x0005 00005 (z.go:6) MOVQ BX,"".~r1+16(FP) 0x000a 00010 (z.go:6) RET

但是,該值儲存在Goroutine 內的新堆疊中,該堆疊隨後在Goroutine 終止時被銷毀,因此無法從主程式存取回傳值。

範例

考慮以下內容code:

func getNumber(i int) chan int {
    ch := make(chan int)
    go func() {
        ch <- i
    }()
    return ch
}

func main() {
    for i := 0; i < 10; i++ {
        ch := getNumber(i)
        num := <-ch
        fmt.Println(num)
    }
    time.Sleep(5)
}
登入後複製

在這個例子中,getNumber函數被當作goroutine調用,它的回傳值並調用不能立即使用,因為它儲存在單獨的堆疊上。

我們應該在 Goroutine 中避免回傳值嗎?

為了避免遺失回傳值,一般建議使用通訊方式Goroutine 與主程式之間共享資料的通道等機制:

以上是Goroutine 中呼叫的函數的回傳值會發生什麼情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板