使用帶有外部函數的sync.WaitGroup的最佳實踐
在提供的程式碼片段中,您在嘗試使用同步時遇到死鎖.WaitGroup 具有外部函數。此錯誤源自於錯誤地將 WaitGroup 的副本傳遞給外部函數,導致未在預期的 WaitGroup 上呼叫 Done() 方法。
要解決此問題,請確保將指標傳遞給而是等待群組。透過這樣做,外部函數可以存取正確的 WaitGroup 並適當地呼叫 Done()。以下是修正後的程式碼:
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) // Pass a pointer to the WaitGroup go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() // Wait for both goroutines to finish } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
或者,您可以修改Print 函數的簽章以刪除WaitGroup 參數,如下所示:
<code class="go">func Print(ch <-chan int) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } }</code>
在這種情況下,Print函數負責在完成後關閉WaitGroup。這種方法更適合外部函數不需要直接存取 WaitGroup 的場景。
以上是為什麼將 `sync.WaitGroup` 與外部函數一起使用會導致死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!