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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
golang复用http.request.body的方法示例
这篇文章主要给大家介绍了关于golang复用http.request.body的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2018-10-10Golang性能提升利器之SectionReader的用法详解
本文将介绍 Go 语言中的 SectionReader,包括 SectionReader的基本使用方法、实现原理、使用注意事项,感兴趣的小伙伴可以了解一下2023-07-07Golang-如何判断一个 interface{} 的值是否为 nil
interface 的内部实现包含了两个字段,一个是 type,一个是 data,这篇文章主要介绍了Golang-如何判断一个interface{}的值是否为nil,需要的朋友可以参考下2023-05-05
最新评论