Kebuntuan dalam Komunikasi Saluran Go Kerana Melepasi Struktur Mengikut Nilai
Dalam kod anda, anda telah mengalami ralat kebuntuan dalam saluran goroutine anda komunikasi. Ralat ini adalah kerana anda menghantar struktur WaitGroup mengikut nilai kepada gorouti anda, yang mencipta salinan WaitGroup dan bukannya berkongsi rujukan asal.
Mengapa Melepasi Nilai Menyebabkan Kebuntuan
Struktur dalam Go diluluskan mengikut nilai, bukan dengan rujukan. Apabila anda menghantar struktur kepada fungsi, salinan dibuat dan diteruskan ke fungsi tersebut. Ini bermakna sebarang perubahan yang dibuat pada struktur dalam fungsi tidak akan ditunjukkan dalam struktur asal di luar fungsi.
Dalam kes anda, goroutine cuba memberi isyarat kepada WaitGroup apabila mereka menyelesaikan tugas mereka. Walau bagaimanapun, memandangkan mereka menggunakan salinan WaitGroup, panggilan Done() mereka tidak menjejaskan WaitGroup yang asal. Akibatnya, panggilan Tunggu() dalam goroutine utama tidak pernah selesai, membawa kepada kebuntuan.
Penyelesaian: Melewati Penunjuk
Untuk menyelesaikan isu ini, anda perlu menghantar WaitGroup ke goroutine anda dengan penunjuk. Ini memastikan bahawa kedua-dua goroutine dan goroutine utama berkongsi rujukan yang sama kepada WaitGroup.
Contoh Berfungsi:
Berikut ialah versi kod anda yang diperbetulkan:
<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>
Sekarang, apabila anda menjalankan kod ini, anda seharusnya tidak lagi menghadapi ralat kebuntuan. Goroutine akan berjaya memberi isyarat kepada WaitGroup dan goroutine utama akan dapat menyelesaikan pelaksanaannya.
Atas ialah kandungan terperinci Mengapa Melepasi Struktur WaitGroup mengikut Nilai Menyebabkan Kebuntuan dalam Komunikasi Saluran Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!