Bagaimana Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup dalam Go?

Linda Hamilton
Lepaskan: 2024-11-13 16:47:02
asal
186 orang telah melayarinya

How to Break Out of a Select Statement When All Channels Are Closed in Go?

Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup

Pertimbangkan senario di mana berbilang goroutine menghantar data ke saluran individu dan anda mahu untuk menggunakan data ini dalam susunan sewenang-wenangnya. Menggunakan pernyataan pilih menawarkan cara yang mudah untuk mengendalikan input serentak daripada pelbagai sumber. Walau bagaimanapun, cabaran timbul apabila anda perlu keluar dari gelung hanya apabila semua saluran ditutup.

Penyelesaian Naif

Pendekatan intuitif mungkin melibatkan menyemak ketersediaan setiap saluran dengan menggunakan bendera ok. Walau bagaimanapun, penyelesaian ini terdedah kepada ralat kerana saluran tertutup tersedia semula jika ia dipilih. Ini membawa kepada gelung tak terhingga, seperti yang ditunjukkan dalam contoh taman permainan ini: http://play.golang.org/p/rOjdvnji49.

Penyelesaian yang Diperbaiki

Lagi pendekatan yang berkesan adalah dengan menggunakan fakta bahawa saluran nihil tidak pernah bersedia untuk komunikasi. Setiap kali saluran ditutup, saluran itu boleh ditetapkan kepada sifar, memastikan saluran itu dikecualikan daripada penyata pilihan masa hadapan. Ini menjamin bahawa gelung hanya ditamatkan apabila semua saluran telah ditutup:

for {
    select {
    case x, ok := <-ch:
        fmt.Println("ch1", x, ok)
        if !ok {
            ch = nil
        }
    case x, ok := <-ch2:
        fmt.Println("ch2", x, ok)
        if !ok {
            ch2 = nil
        }
    }

    if ch == nil &amp;&amp; ch2 == nil {
        break
    }
}
Salin selepas log masuk

Contoh taman permainan: http://play.golang.org/p/8lkV_Hffyj

Pertimbangan Praktikal

Dalam amalan, tidak mungkin anda perlu mengendalikan sejumlah besar saluran dalam satu penyataan pilihan. Jika senario sedemikian timbul, anda dinasihatkan untuk menggunakan penyelesaian yang lebih khusus, seperti pemultipleks saluran, untuk mengelakkan kekacauan kod dengan semakan sifar yang berlebihan.

Atas ialah kandungan terperinci Bagaimana Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup dalam Go?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan