Apakah saluran dalam bahasa Go?
Saluran dalam bahasa Go ialah struktur data khas yang boleh digunakan untuk melaksanakan komunikasi dan penyegerakan antara gorouti yang berbeza. Ia merupakan salah satu komponen teras model konkurensi bahasa Go dan primitif serentak yang paling penting dalam bahasa Go.
Jadi, mengapa saluran begitu penting? Oleh kerana model konkurensi bagi bahasa Go pada asasnya berdasarkan model CSP (Communicating Sequential Processes) dan saluran ialah saluran dalam model CSP, peranannya adalah serupa dengan paip, digunakan untuk memindahkan data antara gorouti yang berbeza, yang membuat goroutine Penyegerakan data menjadi sangat mudah.
Dalam bahasa Go, anda boleh mencipta saluran menggunakan fungsi make terbina dalam dan nyatakan jenis elemen saluran dan saiz penimbal (jika perlu):
ch := make(chan int) // 创建一个无缓冲的 channel ch2 := make(chan string, 10) // 创建一个带有缓冲区的 string 类型的 channel,缓冲区大小为 10
Anda boleh lihat bahawa jika tidak Jika saiz penimbal ditentukan, saluran tidak ditimbal. Ini bermakna apabila goroutine membaca data daripada saluran yang tidak dibuffer, ia menyekat sehingga goroutine lain menulis data ke saluran tersebut. Sejajar dengan itu, apabila goroutine menulis data ke saluran yang tidak dibuffer, ia menyekat sehingga goroutine lain membaca data daripada saluran tersebut.
Sebaliknya, saluran penimbal boleh melakukan operasi tulis tanpa sekatan apabila penimbal tidak penuh dan hanya akan menyekat apabila penimbal penuh. Begitu juga, saluran penimbal boleh melakukan operasi baca tanpa menyekat apabila penimbal tidak kosong, menyekat hanya apabila penimbal kosong.
Dalam bahasa Go, menghantar data melalui saluran adalah sangat mudah. Sebagai contoh, kod berikut menunjukkan cara membuat 2 goroutine, satu goroutine menghantar beberapa data ke saluran dan satu lagi goroutine menerima data daripada saluran dan mencetaknya:
package main import "fmt" func sender(ch chan int) { ch <- 10 ch <- 20 ch <- 30 close(ch) } func receiver(ch chan int) { for { val, ok := <- ch if !ok { break } fmt.Println(val) } } func main() { ch := make(chan int) go sender(ch) go receiver(ch) fmt.Scanln() }
Dalam kod di atas, kami mencipta dinamakan saluran ch dan menyampaikannya kepada dua goroutine pengirim dan penerima. Goroutine penghantar menghantar tiga nilai integer ke ch, dan kemudian menutup saluran, menunjukkan bahawa penghantaran data telah tamat. Goroutine penerima menerima nilai integer dari ch dan mencetak setiap nilai. Pada akhirnya, kami menggunakan fmt.Scanln() untuk menyekat goroutine utama untuk memastikan program tidak keluar.
Perlu diambil perhatian bahawa apabila saluran ditutup, data bacaan goroutine daripadanya akan serta-merta memperoleh nilai sifar tanpa menyekat. Jadi dalam kod di atas, kami menggunakan gelung for untuk terus membaca data daripada saluran dan gelung akan tamat apabila saluran ditutup.
Selain saluran biasa, bahasa Go juga menyediakan saluran dengan pernyataan terpilih. Pernyataan pilih boleh digunakan untuk memilih antara berbilang saluran Setelah mana-mana saluran sedia, operasi yang sepadan akan dilakukan serta-merta. Berikut ialah contoh mudah:
package main import "fmt" func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { ch1 <- 10 }() go func() { ch2 <- 20 }() select { case val := <- ch1: fmt.Println("Received value from ch1:", val) case val := <- ch2: fmt.Println("Received value from ch2:", val) } }
Dalam kod di atas, kami mencipta dua saluran ch1 dan ch2 masing-masing dan menghantar beberapa data kepada mereka. Dalam goroutine utama, kami menggunakan pernyataan pilih untuk memilih saluran yang disediakan daripada dua saluran dan mencetak nilai yang diterima daripada saluran. Dalam contoh ini, memandangkan data dalam ch1 tiba dahulu, pilih akan pilih ch1 dahulu.
Ringkasnya, saluran dalam bahasa Go ialah primitif serentak yang sangat penting yang boleh digunakan untuk mencapai komunikasi dan penyegerakan antara goroutine. Menggunakan saluran boleh menjadikan pengaturcaraan serentak mudah dan elegan, terutamanya dalam beberapa senario serentak yang kompleks, peranan saluran amat jelas.
Atas ialah kandungan terperinci Apakah saluran dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Apabila menggunakan SQL.Open, mengapa DSN tidak melaporkan ralat? Dalam bahasa Go, sql.open ...
