Go语言Select chan用法小结
select 语句是 Go 语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作。select 语句可以用于以下几种情况:
监听多个通道:你可以同时监听多个通道,一旦其中任何一个通道就绪(有数据可读或可写),select 就会选择第一个就绪的通道执行相关操作。
超时操作:你可以使用 select 结合定时器通道来实现超时操作,以确保不会无限期地等待通道操作完成。
避免阻塞:当某个通道操作可能导致程序阻塞时,select 可以帮助你避免阻塞,以保持程序的响应性。
示例 1:监听多个通道
package main import ( "fmt" "time" ) func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(2 * time.Second) ch1 <- "Hello from ch1" }() go func() { time.Sleep(1 * time.Second) ch2 <- "Hello from ch2" }() select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } }
在这个示例中,我们创建了两个协程,每个协程向不同的通道发送消息。然后,在主协程中使用 select 语句监听两个通道,一旦其中一个通道就绪,它就会打印相应的消息。
示例 2:超时操作
package main import ( "fmt" "time" ) func main() { ch := make(chan string) go func() { time.Sleep(2 * time.Second) ch <- "Hello from ch" }() select { case msg := <-ch: fmt.Println(msg) case <-time.After(1 * time.Second): fmt.Println("Timeout") } }
在这个示例中,我们创建了一个协程,它会在2秒后向通道发送消息。然后,在主协程中使用 select 语句监听通道操作,但也使用 time.After 创建了一个1秒的超时定时器。如果通道操作没有在1秒内完成,超时分支会执行,打印 “Timeout”。
示例 3:避免阻塞
package main import ( "fmt" "time" ) func main() { ch := make(chan string) go func() { time.Sleep(2 * time.Second) ch <- "Hello from ch" }() select { case msg := <-ch: fmt.Println(msg) default: fmt.Println("No message received") } }
在这个示例中,我们同样创建了一个协程,但使用了 select 语句的默认分支(default)。如果通道操作不能立即完成,default 分支会执行,打印 “No message received”,而不会阻塞程序。
到此这篇关于Go语言Select chan用法小结的文章就介绍到这了,更多相关Go Select chan内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
实时通信的服务器推送机制 EventSource(SSE) 简介附go实现示例代码
EventSource是一种非常有用的 API,适用于许多实时应用场景,它提供了一种简单而可靠的方式来建立服务器推送连接,并实现实时更新和通知,这篇文章主要介绍了实时通信的服务器推送机制 EventSource(SSE)简介附go实现示例,需要的朋友可以参考下2024-03-03Go语言中strings.HasPrefix、strings.Split、strings.SplitN() 函数
本文主要介绍了Go语言中strings.HasPrefix、strings.Split、strings.SplitN()函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-08-08
最新评论