通道的高级玩法
单向通道
单向通道是只允许写或者读的通道,定义方式如下:
intChan1 := make(chan int)
intChan2 := make(<- chan int ) //只读
intChan2 := make(chan<- int ) //只写
通道的读写
for语句读写
ch1 := make(chan int, 2)
ch1 <- 3
close(ch1)
for elem := range ch1{
fmt.Println(elem)
}
1.for 在close之前会一直阻塞!!!!!!
2.如果为Nil会一直阻塞在for
3.就算被关闭,for也会读出里面的数据,然后停止掉,执行下面的操作。
select
1.select 分为default和case分支,如果没有case满足会执行default
2.如果没有default分支且没有case满足,那么select就会阻塞
3.通道关闭了,但可能还能读到通道里面的数据,所以最好通过读取操作的第二个值判断是否已经关闭了通道。
4.select只能执行一次,所以要想定时或者连续调用,通常需要和for配合,但break操作只会跳出select的case,影响不到外面的for。
select的分支选择规则
1.对于每个case,都至少包含一个代表发送或者接收操作的表达式,同时也可以包含其他的。
2.case表达式会按照代码顺序全部求值
3.对于每一个case,在发送或者接收的时候如果处于阻塞,就说明此case不满足条件。
4.满足条件的case如果大于1会随机选取一个执行,如果等于1执行满足的,如果为0执行default,没default阻塞。
5.并行安全主要在于case里面有没有不安全的操作。
思考题
select里面语句通道关闭,怎么屏蔽掉所在分支
个人感觉可以弄成nil
如果select和for配合怎么跳出for的循环
用go语言的标签,配合goto end 或者break loop
break只能在for前面,且跳转后不执行for,goto的标签可以在for前面或者后面,跳转后执行后面的代码。
网友评论