Pilih Serentak pada Saluran Buffered Send dan Unbuffered Receive
Dalam Go, saluran menyediakan mekanisme untuk komunikasi serentak antara goroutine. Soalan ini meneroka cara untuk memilih secara serentak pada saluran hantar penimbal dan saluran terima tidak penimbal, membenarkan goroutine menghantar atau menerima data berdasarkan ketersediaan saluran.
Memilih pada Saluran Hantar Tertimbal
Untuk memilih pada saluran hantar penimbal, seperti s, tempat data boleh dibariskan sebelum ia diterima, anda boleh menggunakan sintaks berikut:
case s <- v: // Send value `v` to channel `s`
Walau bagaimanapun, dengan saluran penimbal, nilai untuk hantar mesti dinilai terlebih dahulu, yang berpotensi membawa kepada data lapuk dihantar kerana keadaan perlumbaan.
Memilih pada Saluran Penerimaan Tanpa Penimbalan
Memilih pada saluran terima yang tidak ditimbal, seperti r, apabila data tidak beratur, adalah mudah:
case r := <-r: // Receive value `r` from channel `r`
Secara lalai, memilih pada blok saluran terima sehingga data tersedia.
Pilih Serentak
Untuk memilih secara serentak pada kedua-dua saluran hantar buffer s dan saluran terima tidak buffer r, anda boleh menggunakan pernyataan pilih berikut:
select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // No channels are ready, do something else, e.g. sleep }
Mengendalikan Data Lapuk
Apabila menilai nilai untuk dihantar menggunakan v := valueToSend() di luar penyata pilih, ada kemungkinan saluran s menjadi penuh atau saluran r menerima data sebelum nilai dihantar. Untuk mengelakkan data lapuk, kes lalai boleh ditambah pada pernyataan pilih. Kes lalai ini akan dilaksanakan jika kedua-dua saluran tidak sedia dan boleh digunakan untuk melakukan tidur yang singkat, memberikan masa saluran untuk mencapai keadaan sedia.
Mengelakkan Semakan Panjang Saluran Terus
Perlu ambil perhatian bahawa menyemak panjang atau kapasiti saluran dan kemudian menghantar atau menerima adalah tidak boleh dipercayai. Keadaan saluran boleh berubah antara masa menyemak dan menghantar/menerima, menyebabkan gelagat menyekat yang tidak dijangka.
Kesimpulan
Dengan menggunakan pernyataan pilih dengan huruf besar lalai, goroutines boleh memilih secara serentak pada saluran penghantaran terkumpul dan saluran terima yang tidak ditimbal, mengoptimumkan penggunaan saluran dan kecekapan sumber. Walau bagaimanapun, adalah penting untuk mempertimbangkan potensi data lapuk dan mengelakkan semakan panjang saluran terus untuk memastikan komunikasi yang boleh dipercayai.
Atas ialah kandungan terperinci Bagaimanakah anda boleh memilih pada masa yang sama pada saluran penghantaran yang ditimbal dan saluran penerimaan yang tidak ditimbal dalam Go, dan bagaimanakah anda mengendalikan data lapuk yang berpotensi dalam senario ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!