您的位置:首页 > 编程语言 > Go语言

Go语言Select的理解

2016-10-11 00:00 399 查看
package main

import "time"
import "fmt"

func main() {

// 本例中,我们从两个通道中选择
c1 := make(chan string)
c2 := make(chan string)

// 为了模拟并行协程的阻塞操作,我们让每个通道在一段时间后再写入一个值
go func() {
time.Sleep(time.Second * 1)
c1 <- "one"
}()
go func() {
time.Sleep(time.Second * 2)
c2 <- "two"
}()

// 我们使用select来等待这两个通道的值,然后输出
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
default:
fmt.Println("default")
}
}

以上代码只会输出default就退出了,如果我们去掉default,则只会输出one,

for i := 0; i < 2; i++ {
// 我们使用select来等待这两个通道的值,然后输出
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}

如果在select外面加了for循环则会去循环。

总结起来,select只会对每个case去遍历一次,如果不符合Case1,则去判断Case2,如果设定了default,对于都不符合的到default后直接跳出了。如果没有设置default,则会等待Case1,case2中有一个符合退出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: