informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Goroutine berjalan di ruang alamat yang sama, jadi akses ke memori bersama harus disinkronkan.Goroutine berbagi memori melalui komunikasi, bukan berbagi memori.
Saluran tipe referensi adalah implementasi spesifik dari mode CSP dan digunakan untuk komunikasi beberapa goroutine. Ini menerapkan sinkronisasi secara internal untuk memastikan keamanan konkurensi.
Seperti peta, saluran juga merupakan referensi ke struktur data dasar yang dibuat oleh make.
Saat kita menyalin saluran atau menggunakannya untuk meneruskan parameter fungsi, kita hanya menyalin referensi saluran, sehingga pemanggil dan penerima panggilan akan mereferensikan objek saluran yang sama. Seperti tipe referensi lainnya, nilai nol saluran adalah nihil.
Saat Anda menentukan saluran, Anda juga perlu menentukan jenis nilai yang dikirim ke saluran tersebut. Saluran dapat dibuat menggunakan fungsi make() bawaan:
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
Secara default, saluran memblokir saat menerima dan mengirim data, kecuali ujung lainnya sudah siap, membuat sinkronisasi goroutine menjadi lebih sederhana tanpa memerlukan kunci eksplisit.
Saluran tanpa buffer adalah saluran yang tidak memiliki kemampuan untuk menyimpan nilai apa pun sebelum menerima.
Jenis saluran ini mengharuskan goroutine pengirim dan goroutine penerima siap pada saat yang sama untuk menyelesaikan operasi pengiriman dan penerimaan. Jika dua goroutine tidak siap pada saat yang sama, saluran tersebut akan menyebabkan goroutine yang melakukan operasi kirim atau terima terlebih dahulu memblokir dan menunggu.
Interaksi pengiriman dan penerimaan ke saluran ini pada dasarnya sinkron. Tidak ada satu operasi pun yang dapat berdiri sendiri-sendiri satu sama lain.
Gambar berikut menunjukkan bagaimana dua goroutine dapat berbagi nilai menggunakan saluran tanpa buffer:
make (chan Type)//等价于make (chan Type,0)
Jika tidak ada ukuran buffer yang ditentukan, saluran tersebut sinkron dan oleh karena itu diblokir hingga pengirim siap mengirim dan penerima siap menerima.
Saluran buffered adalah saluran yang dapat menyimpan satu atau lebih nilai sebelum diterima.
Jenis saluran ini tidak mengharuskan goroutine menyelesaikan pengiriman dan penerimaan secara bersamaan. Saluran juga akan memiliki kondisi berbeda yang memblokir tindakan pengiriman dan penerimaan. Tindakan penerimaan hanya akan diblokir jika tidak ada nilai dalam saluran yang akan diterima. Tindakan kirim hanya akan memblokir jika saluran tidak memiliki buffer yang tersedia untuk mengakomodasi nilai yang dikirim.
Hal ini menyebabkan perbedaan besar antara saluran yang di-buffer dan tidak di-buffer: saluran yang tidak di-buffer menjamin bahwa goroutine yang mengirim dan menerima akan bertukar data pada saat yang sama: saluran yang di-buffer tidak memiliki jaminan seperti itu.
make (chan Type,capacity)
Jika kapasitas buffer diberikan, salurannya tidak sinkron. Selama buffer mempunyai ruang yang tidak terpakai untuk mengirim data atau berisi data yang dapat diterima, komunikasi akan berlangsung tanpa pemblokiran.
Saluran dapat menggunakan ok untuk mendeteksi apakah saluran masih terbuka. Jika saluran ditutup, data tidak akan terbaca.
num ,ok:=<-ch
Dapat mendeteksi jika suatu saluran ditutup.Secara default, saluran tersebut memiliki pertanyaan ganda, yaitu, Anda dapat mengirim data ke saluran tersebut dan menerima data dari saluran tersebut.
Namun, kita sering melihat saluran dilewatkan sebagai parameter dan nilainya diharapkan digunakan dalam satu arah, baik hanya untuk mengirim data atau hanya untuk menerima data. Saat ini, kita dapat menentukan arah saluran. Deklarasi variabel chamel satu arah sangat sederhana, sebagai berikut:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- berarti data masuk ke pipa, dan data ditulis ke dalam pipa, yang dikeluarkan ke pemanggil.
<-chan menandakan data yang keluar dari pipa. Bagi pemanggil, data dari pipa tersebut diperoleh, yang tentunya menjadi input.
Suatu saluran secara implisit dapat diubah menjadi antrian satu arah, hanya menerima atau mengirim saja, tetapi saluran satu arah tidak dapat diubah menjadi saluran normal;