WaitGroups 參考中的指標或變數
Sync 套件提供了諸如 Add、Done 和 Wait 等功能來管理等待群組。在使用這些函數時,了解指標和變數的正確用法非常重要。
Add 和 Wait 函數都是使用指向等待群組的指標來呼叫的,如其函數宣告中所示。這是預期的行為,因為它們修改了等待群組的內部狀態。
但是,Done 函數在以下程式碼範例中可能看起來是一個例外:
var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait()
在此程式碼中,使用指標變數 (&wg) 呼叫 Done 函數。這可能會導致混亂,因為它與 Add 和 Wait 的用法不同。
解釋在於 Go 中變數如何傳遞給函數。當變數作為參數傳遞給函數時,會建立其值的副本。在這種情況下,如果直接使用 wg(不含 &)呼叫 Done 函數,則工作函數將收到等待群組的副本。 Worker 函數內所做的任何變更都不會影響主 Goroutine 中的原始等待群組實例,否則會導致同步問題。
因此,需要將等待群組(&wg)的位址傳遞給 Done這樣工作函數就可以直接存取原始等待群組實例,並可以相應地修改其內部狀態。
這也凸顯了 Go 中指標接收器和值接收器之間的差異。接收器函數可以定義為指標接收器 (*WaitGroup) 或值接收器 (WaitGroup)。指標接收器允許函數修改底層值,而值接收器會建立變數的副本,允許函數在自己的副本上進行操作而不影響原始值。
在這種特殊情況下,有必要使用所有三個函數(Add、Done、Wait)的指標接收器,因為它們都需要修改等待群組的內部狀態。雖然 Done 看起來是一個例外,但它實際上遵循提供對原始等待群組實例的直接存取的相同原則。
以上是我應該在 Go 的 WaitGroup 的 Add、Done 和 Wait 函數中使用指標或變數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!