由於按值傳遞結構導致Go 通道通訊死鎖
在您的程式碼中,您在goroutine 通道中遇到了死鎖錯誤溝通。此錯誤是因為您將 WaitGroup 結構按值傳遞給 goroutine,這會建立 WaitGroup 的副本,而不是共用原始參考。
為什麼按值傳遞會導致死鎖
Go 中的結構體是按值傳遞的,而不是按引用傳遞的。當您將結構傳遞給函數時,會建立副本並將其傳遞給該函數。這意味著對函數內結構所做的任何更改都不會反映在函數外部的原始結構中。
在您的情況下,goroutine 在完成任務時會嘗試向 WaitGroup 發出信號。但是,由於他們使用 WaitGroup 的副本,因此他們的 Done() 呼叫不會影響原始 WaitGroup。因此,主協程中的 Wait() 呼叫永遠不會完成,從而導致死鎖。
解決方案:透過指標傳遞
要解決此問題,您可以需要透過指標將 WaitGroup 傳遞給您的 goroutine。這確保了 goroutine 和主 goroutine 共享對 WaitGroup 的相同引用。
工作範例:
這是程式碼的正確版本:
<code class="go">package main import ( "fmt" "sync" ) func push(c chan int, wg *sync.WaitGroup) { for i := 0; i < 5; i++ { c <- i } wg.Done() } func pull(c chan int, wg *sync.WaitGroup) { for i := 0; i < 5; i++ { result, ok := <-c fmt.Println(result, ok) } wg.Done() } func main() { var wg sync.WaitGroup wg.Add(2) c := make(chan int) go push(c, &wg) go pull(c, &wg) wg.Wait() }</code>
現在,當您執行此程式碼時,您應該不再遇到死鎖錯誤。 goroutine 將成功向 WaitGroup 發出訊號,主 goroutine 將能夠完成其執行。
以上是為什麼按值傳遞 WaitGroup 結構會導致 Go Channel 通訊死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!