Saluran Golang ialah ciri yang sangat penting dalam bahasa Go Selain mengendalikan tugas pengaturcaraan serentak, ia juga boleh digunakan untuk penghantaran mesej dan pemberitahuan acara. Dalam aplikasi sebenar, kami biasanya menggunakan saluran untuk meningkatkan keteguhan dan kebolehskalaan program. Artikel ini akan memberi tumpuan kepada penggunaan asas saluran Golang.
1. Apakah saluran Golang?
Di Golang, saluran ialah jenis asli yang boleh digunakan untuk memindahkan data antara gorouti yang berbeza. Saluran boleh dilihat sebagai bekas yang mengandungi bilangan elemen tertentu, setiap elemen adalah daripada jenis.
2. Definisi dan pengisytiharan saluran Golang
Untuk menentukan saluran, anda boleh menggunakan kaedah buat untuk menentukan kapasiti dan jenis saluran:
ch := make(chan int, 10)
Di atas kod mencipta saluran dengan kapasiti 10 saluran jenis int.
3. Operasi asas saluran Golang
1 Menghantar data (pemindahan data)
Kami boleh menggunakan operator saluran <-
untuk menulis data ke dan dari saluran , seperti berikut Seperti yang ditunjukkan:
ch <- 100
Kod di atas adalah untuk menulis data 100 ke dalam saluran ch
.
2. Terima data (bacaan data)
Baca data daripada saluran, dan juga gunakan operator saluran <-
untuk beroperasi.
data := <- ch
Kod di atas membaca data daripada ch
dan menyerahkannya kepada pembolehubah data
.
3. Tutup saluran
Selepas menggunakan saluran, kita perlu menutupnya untuk memaklumkan kepada penerima bahawa tiada lagi data akan diterima.
close(ch)
4. Ciri menyekat saluran Golang
Saluran di Golang mempunyai ciri menyekat, yang membantu kami mengurus sumber program, mengoptimumkan prestasi dan meningkatkan kebolehbacaan.
1. Menyekat saluran tidak buffer
Dalam saluran tidak buffer tanpa sebarang penimbal, kedua-dua penerima dan penghantar akan disekat. Dalam contoh di bawah, saluran tidak buffer ch
menyekat pelaksanaan fungsi main
sehingga data dihantar dan diterima.
func main() { ch := make(chan int) go func() { fmt.Println("before data sent") ch <- 1 fmt.Println("after data sent") }() fmt.Println("before data received") data := <-ch fmt.Println("data received:", data) fmt.Println("after data received") }
Dalam kod di atas, memandangkan goroutine utama menjalankan untuk membaca saluran terlebih dahulu, dan saluran itu disekat, ia mesti menunggu sehingga data dalam goroutine ch <- 1
dihantar.
2. Menyekat saluran buffer
Berbanding dengan saluran tidak buffer, dalam saluran buffer, penghantar tidak akan disekat sehingga penerima menerima data. Bergantung pada saiz penimbal, sejumlah data boleh ditulis ke saluran tanpa menyekat.
Dalam contoh berikut, kami mencipta saluran jenis int buffer dengan saiz cache 2, tetapi hanya menghantar satu data kepadanya:
func main() { ch := make(chan int, 2) fmt.Println("buffered channel created") ch <- 1 fmt.Println("data sent") }
Memandangkan saiz cache saluran ialah 2, Oleh itu, operasi hantar tidak disekat semasa menulis mesej pertama ke saluran. Walau bagaimanapun, jika kita cuba menulis semula mesej, ia akan menyekat sehingga terdapat ruang dalam penimbal.
3.select
Pernyataan pilih boleh digunakan untuk memproses berbilang saluran dan menghalang penyekatan Ia membolehkan program memilih antara berbilang saluran, dengan itu mencapai pemprosesan serentak dan pengoptimuman sumber. Untuk sebarang kes, data boleh diterima atau dihantar, dan pernyataan pilih disekat.
Dalam contoh di bawah, kami menggunakan pilih untuk mengimbangi bacaan kepada kedua-dua saluran:
func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(time.Second) ch1 <- 1 }() go func() { time.Sleep(2 * time.Second) ch2 <- 2 }() for i := 0; i < 2; i++ { select { case data1 := <-ch1: fmt.Println("data from ch1:", data1) case data2 := <-ch2: fmt.Println("data from ch2:", data2) } } }
Dalam contoh di atas, sintaks select
membolehkan kami menukar daripada mematuhi saluran ch1
kepada ch2
sehingga kami berjaya mendapatkan data dari salah satu saluran. Selepas ini, program akan keluar.
Ringkasan:
Artikel ini memperkenalkan saluran dalam bahasa Go secara terperinci dan menerangkan penggunaan dan kepentingan khusus saluran Golang. Apabila kami menangani masalah pengaturcaraan serentak, saluran selalunya merupakan pilihan pertama kami untuk struktur data. Di Golang, saluran mempunyai banyak kelebihan, seperti komunikasi merentas program, mekanisme penyegerakan dan penyekatan, dan pemilih, dsb., yang boleh membolehkan bahasa Go digunakan dengan berkesan dan berfungsi dengan cekap dalam banyak aspek. Saya harap artikel ini dapat membantu anda menggunakan saluran dalam bahasa Go dengan lebih baik dan memberikan bantuan dalam membangunkan program bahasa Go yang cekap.
Atas ialah kandungan terperinci Cara menggunakan saluran golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!