go select

select用于处理多个ch。

其所有case中的channel表达式和右侧的发送语句都会被计算(从上到下)

如果多个case都可以执行,则随机选择一个case。 

 

func test_select_recv() {
	ch := make(chan int)

	go func() {
		fmt.Println("select begin")
		select {
		case v := <-ch:
			fmt.Println("recv 1:", v)
		case v := <-ch:
			fmt.Println("recv 2:", v)
			//		default:
			//		fmt.Println("default nothing")
		}
		fmt.Println("select done")
	}()

	ch <- 1
}

两个case随机一个执行。

如果ch没有收到数据,则select阻塞。

如果有default并且没有case可执行,则执行default 

 

func test_select_send() {
	ch := make(chan int)

	go func() {
		select {
		case ch <- func() int {
			fmt.Println("get 1")
			return 1
		}():
			fmt.Println("send 1")
		case ch <- func() int {
			fmt.Println("get 2")
			return 2
		}():
			fmt.Println("send 2")
		}
	}()

	v := <-ch
	fmt.Println("recv: ", v)
}
 输出:

 

get 1

get 2

send 1 

recv: 1

可以看到两个发送channel后面的函数都执行了, 随机选一个send

 

select {}  //block forever

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值