Cara menggunakan saluran golang

WBOY
Lepaskan: 2023-05-10 14:07:37
asal
653 orang telah melayarinya

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)
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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)
Salin selepas log masuk

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")
}
Salin selepas log masuk

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")
}
Salin selepas log masuk

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)
        }
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan