Rumah >pembangunan bahagian belakang >Golang >Cara menutup saluran di golang dengan betul

Cara menutup saluran di golang dengan betul

PHPz
PHPzasal
2023-04-03 11:15:211309semak imbas

Golang ialah bahasa pengaturcaraan yang semakin popular di kalangan pembangun sejak beberapa tahun kebelakangan ini. Ia menyediakan banyak ciri mudah, salah satunya ialah Saluran.

Saluran ialah mekanisme yang digunakan untuk komunikasi antara Goroutine di Golang. Kelebihan saluran ialah ia boleh menjamin atomicity pertukaran data dan boleh mencapai penyegerakan antara berbilang coroutine.

Apabila menggunakan saluran, biasanya kita menghadapi situasi menutup saluran. Artikel ini menerangkan cara menutup saluran dengan betul.

1. Cara menutup saluran

Menutup saluran di Golang adalah sangat mudah Anda hanya perlu memanggil fungsi yang melepasi saluran dalam program atau memanggil fungsi Tutup terus dalam program. Fungsi Tutup dilaksanakan oleh pemalar bahasa Go "iota". Setelah saluran ditutup, data tidak boleh dihantar kepadanya, tetapi data boleh dibaca dari saluran tertutup.

Kod sampel:

func main() {
    channel := make(chan int)
 
    go func() {
        for i := 0; i < 10; i++ {
            channel <- i
        }
        close(channel)
    }()
 
    for v := range channel {
        fmt.Println(v)
    }
}

Dalam kod sampel di atas, kami mencipta saluran dan menulis 10 nombor dalam coroutine. Akhir sekali, kami menggunakan fungsi tutup untuk menutup saluran.

2. Saluran ditutup secara automatik

Di Golang, saluran mempunyai ciri yang sangat mudah, iaitu, ia boleh ditutup secara automatik. Apabila saluran tidak dirujuk oleh coroutine, saluran akan ditutup secara automatik.

Kod sampel:

func main() {
    channel := make(chan int, 10)
 
    for i := 0; i < 10; i++ {
        channel <- i
    }
 
    go func() {
        for v := range channel {
            fmt.Println(v)
        }
    }()
 
    // 延时一段时间,等待协程执行完成
    time.Sleep(1 * time.Second)
}

Dalam kod sampel di atas, kami mencipta saluran dengan saiz penimbal 10 dan melelar ke atas saluran dan mengeluarkan nilai dalam coroutine. Akhir sekali, kami menggunakan pustaka masa untuk menunggu selama 1 saat untuk memastikan bahawa pelaksanaan coroutine selesai. Apabila pelaksanaan coroutine selesai, saluran akan ditutup secara automatik.

3. Elakkan menutup saluran tertutup

Apabila menggunakan saluran, kita perlu mengelak daripada menutup saluran tertutup. Jika berbilang coroutine cuba menutup saluran pada masa yang sama, program akan ranap.

Kod sampel:

func main() {
    channel := make(chan int)
 
    close(channel)
    close(channel)
}

Dalam kod sampel di atas, kami mencipta saluran dan cuba memanggil fungsi tutup dua kali dalam program. Ini akan menyebabkan program ranap.

4. Elakkan daripada menghantar data ke saluran tertutup

Apabila menggunakan saluran, kita juga perlu mengelak daripada menghantar data ke saluran tertutup. Jika anda menghantar data dalam saluran tertutup, ia akan menyebabkan program ranap.

Kod sampel:

func main() {
    channel := make(chan int)
 
    close(channel)
 
    channel <- 1
}

Dalam kod contoh di atas, kami mencipta saluran dan memanggil fungsi tutup dalam program. Kami kemudian cuba menghantar data ke saluran tertutup, yang akan menyebabkan program ranap.

Di Golang, adalah sangat penting untuk menutup saluran dengan betul, kerana menutup saluran adalah satu cara untuk memastikan keselamatan coroutine. Setelah saluran ditutup, data tidak boleh dihantar kepadanya, tetapi data boleh dibaca daripada saluran tertutup. Apabila menggunakan saluran, kita perlu mengelak daripada menutup saluran tertutup atau menghantar data ke saluran yang telah ditutup, yang akan menyebabkan program ranap.

Atas ialah kandungan terperinci Cara menutup saluran di golang dengan betul. 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