理解 Goroutine 中的回傳值
在 Go 中,goroutine 是與主程式同時運作的輕量級並發原語。當 goroutine 呼叫有傳回值的函數時,就會出現一個問題:回傳值去了哪裡?
函數傳回值在堆疊上
Go 彙編輸出揭示了 goroutine 中呼叫的函數的回傳值儲存在堆疊中。在範例函數getNumber() 中,傳回值i 儲存在堆疊中,如組譯程式碼所示:
0x000a 00010 (z.go:6) RET ,
Inaccessibility of Return Values from Goroutines
但是,這個儲存的回傳值在goroutine 之外是不可存取的。這是因為 goroutine 在單獨的堆疊上運行,當 goroutine 完成執行時,這些堆疊就會被銷毀。因此,在 Goroutine 終止後,儲存在 Goroutine 堆疊上的任何資料都將變得無法存取。
避免 Goroutine 中的回傳值
由於 Goroutine 的回傳值不可訪問,通常建議避免在 goroutine 呼叫的函數中使用回傳值。相反,請考慮使用替代通訊機制(例如通道或共享記憶體)在 Goroutine 之間傳遞資料。
結論
goroutine 中的回傳值儲存在 Goroutine 的堆疊中,但是它們不能在 goroutine 之外存取。因此,建議避免在作為 Goroutine 呼叫的函數中使用回傳值,而是採用其他通訊機制在 Goroutine 之間共享資料。
以上是Goroutines 如何處理函數回傳值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!