转载请注明出处:
在Go语言中,select语句用于处理多个通道的并发操作。它类似于switch语句,但是select语句用于通信操作,而不是条件判断。select语句会同时监听多个通道的操作,并选择其中一个可用的通道进行操作。 select语句的语法如下:
select { case channel1: // 执行channel1的操作 case data := channel2: // 执行channel2的操作,同时将通道中的数据赋值给data变量 case channel3 data: // 将data写入channel3 default: // 当没有任何通道操作时执行default语句 }
select
语句中可以包含多个case
子句,每个case
子句表示一个通道操作。符号用于从通道中读取数据,
channel
-
如果有多个通道都可以操作,则随机选择一个进行操作。
-
如果没有任何通道可以操作,则会执行
default
语句(如果有)。 -
如果没有
default
语句,则select
语句会阻塞,直到至少有一个通道可以操作。
下面是一个使用select
语句的示例:
package main import ( "fmt" "time" ) func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(time.Second) ch1 1 fmt.Println("ch1 ending") }() go func() { time.Sleep(2 * time.Second) ch2 2 fmt.Println("ch2 ending") }() select { case data := ch1: fmt.Println("收到ch1的数据:", data) case data := ch2: fmt.Println("收到ch2的数据:", data) case 100 * time.Second): fmt.Println("超时:没有接收到任何数据") } }
在上面的例子中,我们创建了两个通道ch1
和ch2
,并分别在不同的goroutine中向它们发送数据。然后使用select
语句监听这两个通道的操作,当其中一个通道可用时,就会执行对应的case
语句。
在这个例子中,由于ch1
的数据发送操作会在1秒后执行,而ch2
的数据发送操作会在2秒后执行,因此select
语句会等待1秒后,执行ch1
的case
语句,输出”收到ch1的数据: 1″。如果我们将ch1
的发送操作改为在2秒后执行,那么select
语句将会等待2秒后,执行ch2
的case
语句,输出”收到ch2的数据: 2″。
需要注意的是,select
如果希望持续监听多个通道的操作,可以将select
语句放在一个无限循环中。
package main import ( "fmt" "time" ) func main() { channel1 := make(chan int) channel2 := make(chan string) go func() { for i := 0; i 5; i++ { time.Sleep(time.Second) channel1 i } close(channel1) }() go func() { for i := 0; i 5; i++ { time.Sleep(time.Second) channel2 "Message %d", i) } close(channel2) }() for { select { case data1, ok := channel1: if ok { fmt.Println("Received from channel1:", data1) } else { fmt.Println("Channel1 closed") channel1 = nil } case data2, ok := channel2: if ok { fmt.Println("Received from channel2:", data2) } else { fmt.Println("Channel2 closed") channel2 = nil } } if channel1 == nil && channel2 == nil { break } } fmt.Println("Done") }
在这个示例中,创建了两个通道channel1
和channel2
,分别用于发送不同类型的数据。然后分别启动两个goroutine,每个goroutine向对应的通道发送一些数据,然后关闭通道。其运行得结果如图:
上述代码中 ok
是从通道的属性中获取的。在Go语言中,当从通道接收数据时,会返回两个值:接收到的数据和一个表示通道是否已关闭的布尔值。这个布尔值就是ok
。 当通道已关闭且没有数据可读取时,会返回通道元素类型的零值和false
。当通道还未关闭且有数据可读取时,会返回通道中的数据和true
。 因此,使用data, ok := 的语法可以同时接收通道中的数据和判断通道是否已关闭。
data
表示接收到的数据,ok
表示通道是否还有数据可读取。如果ok
为false
,则表示通道已关闭,没有数据可读取。
在主函数中,我们使用无限循环和select
语句来持续监听这两个通道的操作。每次循环时,select
语句会选择其中一个可用的通道进行操作。如果通道关闭,我们会将对应的通道设置为nil
,以便在后续的循环中跳过该通道的操作。当两个通道都关闭,即channel1
和channel2
都为nil
时,我们跳出循环,程序结束。
运行上述代码,你会看到程序持续监听两个通道的操作,并打印接收到的数据,直到两个通道都关闭。最后,程序输出”Done”并结束。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
原神服务器服务端多人联机教程 大家好,我是艾西在上一篇文章中我们说了win系统服务器怎么搭建原神服务端,在最后结尾时有带一嘴怎么改为多人联机但不是很详细。哪么这篇文章艾西会给小伙伴们说清楚原神服务端怎么改为多人联机,毕竟玩游戏肯定得和朋友一起玩才有意思嘛 请注…