Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup dalam Go?

Bagaimana Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-13 16:47:02188semak imbas

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
    }
}

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!

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