golang中channel是一个比较重要的类型,声明关键字chan
1 | package main |
channel 可以看作是一个管道,<-是它的操作符,当<-在channel右边时表示往channel里面写数据,<-在左边表示从channel读取数据,声明channel时需要制定数据类型,并可以指定缓冲大小,适当的设置缓冲区大小可以提高程序的效率,因为channel在读写数据时,如果channel里面为空或者存满了,读写操作会一直阻塞。这点类似python的队列queue
前面提到channel会存在阻塞问题,所以当使用多个channel时,可以用select 来监听
1 | package main |
输出为:
5
6
null
select可以看作channel的switch,它会按代码顺序区判断是否有channel可以读,如果没有channel可读则走default的运算
select可以结合time设置阻塞超时
1 | package main |
输出:
5
time out
2019-01-04 11:24:51.127522602 +0800 CST m=+1.002540136
select 语句在没有设置default的时候,会一直阻塞到其中一个case收到消息位置,time.After()是一个单向的channel,会在延迟指定时间后发送当前时间给返回对象
v1.5.2