Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah saluran dalam bahasa Go?

Apakah saluran dalam bahasa Go?

WBOY
WBOYasal
2023-06-10 13:57:081598semak imbas

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn