Rumah >pembangunan bahagian belakang >Golang >Mengapakah menggunakan `sync.WaitGroup` dengan fungsi luaran membawa kepada kebuntuan?
Amalan Terbaik untuk Menggunakan penyegerakan.WaitGroup dengan Fungsi Luaran
Dalam coretan kod yang disediakan, anda menghadapi kebuntuan apabila cuba menggunakan penyegerakan .WaitGroup dengan fungsi luaran. Ralat berpunca daripada menghantar salinan WaitGroup kepada fungsi luaran secara salah, menyebabkan kaedah Done() tidak digunakan pada WaitGroup yang dimaksudkan.
Untuk menangani isu ini, pastikan anda menghantar penunjuk ke WaitGroup sebaliknya. Dengan berbuat demikian, fungsi luaran boleh mengakses WaitGroup yang betul dan memanggil Done() dengan sewajarnya. Berikut ialah kod yang diperbetulkan:
<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>
Sebagai alternatif, anda boleh mengubah suai tandatangan fungsi Cetak untuk mengalih keluar parameter WaitGroup, seperti yang ditunjukkan di bawah:
<code class="go">func Print(ch <-chan int) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } }</code>
Dalam kes ini, Print fungsi bertanggungjawab untuk menutup WaitGroup apabila ia selesai. Pendekatan ini lebih disukai dalam senario di mana fungsi luaran tidak memerlukan akses terus ke WaitGroup.
Atas ialah kandungan terperinci Mengapakah menggunakan `sync.WaitGroup` dengan fungsi luaran membawa kepada kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!