這是出現頻率非常高的一種模式,主要用於持續地從多個 Go 通道(channels)中接收數據,此結構組合了 for 循環和 select 語句,讓你可以在一個無限循環中等待多個通道上的操作。
for 循環:確保 select 語句持續地執行,除非你主動終止它(例如,通過 break)。
select 語句:允許你等待多個通道操作。當某個通道可以執行讀取或寫入時,它會執行該操作。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
for {
ch1 <- "Message from channel 1"
time.Sleep(2 * time.Second)
}
}()
go func() {
for {
ch2 <- "Message from channel 2"
time.Sleep(3 * time.Second)
}
}()
for {
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}
}
在上面的例子中,我們有兩個 goroutine 向兩個不同的通道 ch1 和 ch2 發送數據。在主要的 for-select 循環中,程序會等待這兩個通道上的數據。當其中一個通道有可用的數據時,它會從該通道讀取數據並處理它。
總之,for-select 循環是一個非常有用的工具,特別是當你處理多個通道和並行操作時。這使得你可以在一個集中的位置等待和處理多個通道的數據。