editor php Xiaoxin Dalam bahasa Go, saluran ialah mekanisme yang digunakan untuk memindahkan data antara goroutine. Gelagat saluran bergantung pada cara mesej dihantar kepadanya. Apabila saluran diisytiharkan sebagai penimbal, goroutine yang menghantar mesej akan meletakkan mesej ke dalam penimbal saluran dan kemudian meneruskan pelaksanaan. Apabila saluran diisytiharkan tidak buffer, goroutine yang menghantar mesej akan disekat sehingga goroutine lain menerima mesej daripada saluran. Oleh itu, boleh dikatakan bahawa tingkah laku saluran berubah bergantung pada cara mesej dihantar kepadanya.
Mengapa kedua-dua keping kod ini dilaksanakan secara berbeza?
fatal 错误:所有 goroutine 都在休眠 - 死锁!
ralat. func main() { ch := make(chan int) ch <- 1 fmt.println(<-ch) }
ch := make(chan int) go buffer(ch) fmt.Println(<-ch) fmt.Println(<-ch) } func buffer(ch chan int) { ch <- 2 ch <- 3 }
#1 hanya berfungsi dengan betul jika ch ditakrifkan sebagai saluran penimbal. kenapa? Mengapa buffer() dalam ch menerima 2 nilai tanpa mengeluh?
Hantar operasi pada saluran yang tidak buffer akan disekat sehingga goroutine lain membaca data daripadanya. Inilah sebabnya mengapa sekeping kod pertama menemui jalan buntu: apabila anda menghantar ke saluran, tiada goroutine lain membaca daripadanya.
Dalam kes kedua, anda mempunyai goroutine menghantar dua nilai ke saluran, dan goroutine utama membaca dari saluran dua kali semasa menghantar. Saluran tidak menerima dua hantaran, tetapi satu demi satu, dengan operasi penghantaran pertama dinyahsekat oleh bacaan pertama dan operasi penghantaran kedua dinyahsekat oleh bacaan kedua.
Atas ialah kandungan terperinci Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!