當所有通道都關閉時突破Select 語句
考慮一個場景,多個goroutine 向各個通道發送數據,並且您希望以任意順序使用這些數據。使用 select 語句提供了一種處理來自多個來源的並發輸入的便捷方法。然而,當您僅在所有通道都關閉時才需要退出循環時,就會出現挑戰。
樸素解決方案
直觀的方法可能涉及檢查每個通道的可用性通過使用 ok 標誌。但是,此解決方案很容易出錯,因為關閉的通道在被選擇後會再次變得可用。這會導致無限循環,如這個遊樂場範例所示:http://play.golang.org/p/rOjdvnji49。
改進的解決方案
更多有效的方法是利用零通道從未準備好進行通信的事實。每次通道關閉時,都可以將其設為 nil,以確保將其從未來的 select 語句中排除。這保證了循環僅在所有通道關閉時終止:
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 && ch2 == nil { break } }
Playground 範例:http://play.golang.org/p/8lkV_Hffyj
實際注意事項
實際上,您不太可能需要在單一select 語句中處理大量通道。如果發生這種情況,建議使用更專業的解決方案,例如通道多工器,以避免過多的 nil 檢查使程式碼變得混亂。
以上是Go中所有Channel都關閉時如何跳出Select語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!