Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go Select chan

Go语言Select chan用法小结

作者:higher_speeder

select语句是Go语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作,本文就详细介绍一下如何使用,感兴趣的可以了解一下

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文