Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah tingkah laku saluran penimbal berbeza daripada apa yang saya jangkakan daripada Go?
Dalam bahasa Go, saluran penimbal ialah jenis saluran khas yang berkelakuan berbeza daripada saluran biasa. Apabila saluran biasa menghantar data, penghantar akan disekat sehingga penerima menerima data. Saluran penimbal membolehkan pengirim meneruskan penghantaran data apabila saluran tidak penuh tanpa disekat. Ini membolehkan pengirim menyelesaikan operasi penghantaran dengan lebih cepat tanpa perlu menunggu penerima. Bagi pengguna bahasa Go, gelagat saluran penimbal boleh memberikan prestasi serentak yang lebih tinggi dan kelajuan tindak balas yang lebih baik.
Saya cuba memahami cara saluran penimbal berfungsi dan menulis coretan kod untuknya
package main import ( "fmt" ) func squares(c chan int) { for i := 0; i < 4; i++ { num := <-c fmt.println(num * num) } } func main() { fmt.println("main() started") c := make(chan int, 3) go squares(c) c <- 1 c <- 2 c <- 3 c <- 4 // blocks here fmt.println("main() stopped") }
Cara saya menjangkakan program akan bertindak, goroutine utama bermula dan berterusan sehingga c<-4, di mana ia menyekat dan mengawal pergi ke goroutine segi empat sama (kerana kapasiti penimbal ialah 3). Gelung dalam petak goroutine berterusan sehingga lelaran keempat, apabila saluran kosong. Operasi baca pada saluran kosong akan disekat, jadi kawalan dikembalikan kepada goroutine utama. Pada masa ini, operasi tulis ke saluran (c<-4) dilaksanakan, kami mencetak "main() telah berhenti", dan program tamat.
bermakna output jangkaan saya ialah,
main() started 1 4 9 main() stopped
Tetapi saya mendapat output,
main() started 1 4 9 16 main() stoppedbagaimana? Adakah saya terlepas sesuatu tentang cara saluran berfungsi?
Bukan begitu cara saluran berfungsi.
Gorutin berjalan serentak. Ini bermakna apabila Goroutine menghantar ke saluran penimbal, Goroutine lain yang menunggu untuk menerima daripada saluran itu boleh menerimanya dengan segera. Ia tidak menunggu saluran penuh.
Bagi penghujung program, apabila anda menghantar nombor terakhir ke saluran, tiada jaminan bahawa goroutine akan mengambilnya dan mencetak output sebelum program tamat, kerana anda tidak menunggu goroutine selesai. Jadi, nasib baik, ia berjalan dan mencetak output. Akan ada pelaksanaan lain di mana ini tidak akan berlaku dan program akan ditamatkan sebelum goroutine mencetak output.
Atas ialah kandungan terperinci Bagaimanakah tingkah laku saluran penimbal berbeza daripada apa yang saya jangkakan daripada Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!