🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> # select 多路复用 - select : 多路复用 - 在 Go 的 `select` 语句中,如果有多个 `case` 可以执行,Go 会随机选择一个可运行的 `select` 语句是 Go 语言中用于处理多个通道操作的控制流结构。它允许你在多个通道之间进行非阻塞的选择操作,以响应首先准备好的通道。`select` 语句通常与 `case` 子句一起使用,每个 `case` 子句关联一个通道操作。 `select` 语句的主要作用是: 1. **非阻塞等待**:`select` 语句使你可以等待多个通道操作,而不会阻塞当前 Goroutine。这意味着你可以同时等待多个通道的数据或信号,以确定哪个通道首先准备好。 2. **多路复用**:`select` 允许你在多个通道上执行非阻塞的读取或写入操作,以便在任何通道就绪时立即执行相应的操作。 3. **超时处理**:`select` 语句可以与 `time.After` 结合使用,用于实现超时操作。你可以将一个 `case` 子句设置为在指定的时间段之后触发,以处理超时情况。 ~~~ package main import ( "fmt" "time" ) func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(2 * time.Second) ch1 <- "Data from Channel 1" }() go func() { time.Sleep(1 * time.Second) ch2 <- "Data from Channel 2" }() select { case data1 := <-ch1: fmt.Println(data1) case data2 := <-ch2: fmt.Println(data2) case <-time.After(3 * time.Second): fmt.Println("Timeout: No data received in 3 seconds.") } } ~~~ ~~~ package main import ( "fmt" "time" ) func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { ch1 <- 1 }() go func() { ch2 <- 2 }() time.Sleep(1 * time.Second) select { case <-ch1: fmt.Println("Received from channel 1") case <-ch2: fmt.Println("Received from channel 2") default: fmt.Println("No communication yet") } } ~~~