Gelagat Penimbalan dalam Saluran Go: make(chan bool) lwn. make(chan bool, 1)
Saluran tidak buffer, dibuat menggunakan make (chan bool), berbeza daripada saluran buffer yang ditakrifkan dengan make(chan bool, 1) dalam keupayaannya untuk menyimpan nilai.
Saluran Tidak Dibuffer: make(chan bool)
- Tidak boleh menyimpan sebarang nilai.
- Menulis blok sehingga penerima bersedia untuk menggunakan data.
- Membaca blok sehingga data tersedia atau saluran ditutup.
Contoh:
<code class="go">chanFoo := make(chan bool)
// Writes will block because no receiver is waiting
chanFoo <- true
// Corresponding read will now succeed even though no value was sent
<-chanFoo</code>
Salin selepas log masuk
Saluran Penampan: make(chan bool, 1)
- Boleh menyimpan satu nilai.
- Tulisan hanya akan disekat jika penimbal penuh.
- Bacaan hanya akan disekat jika penimbal kosong.
Contoh:
<code class="go">chanFoo := make(chan bool, 1)
// Write will succeed immediately
chanFoo <- true
// Subsequent read will also succeed
<-chanFoo</code>
Salin selepas log masuk
Perbezaan dalam Gelagat
-
Saluran yang tidak ditimbal: Pastikan penyegerakan antara penghantar dan penerima.
-
Saluran yang ditimbal: Benarkan tak segerak komunikasi di mana data boleh dihantar tanpa menunggu penerima, dan bacaan boleh berlaku tanpa menyekat jika data tersedia.
Kepraktikalan Saluran Tidak Dibuffer
Semasa tidak dibuffer saluran mungkin kelihatan kurang intuitif atau kurang berguna, ia mempunyai aplikasi khusus:
-
Penyegerakan Ketat: Saluran tidak buffer menjamin penghantaran dan penerimaan berlaku mengikut urutan, menjadikannya sesuai untuk data yang ditala halus pemindahan.
-
Saluran Isyarat: Saluran yang tidak ditimbal selalunya digunakan untuk isyarat atau hantaran bendera, di mana ia tidak perlu menyimpan nilai dalam saluran. Kehadiran atau ketiadaan data dalam saluran adalah penting.
-
Pemberitahuan Ralat: Saluran yang tidak ditimbal boleh digunakan untuk melaporkan ralat, di mana satu operasi tulis serta-merta menyekat pengirim dan membenarkan penerima untuk tangani ralat.
Atas ialah kandungan terperinci Apakah Perbezaan dalam Gelagat Penimbalan antara `make(chan bool)` dan `make(chan bool, 1)` dalam Go Channels?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!