有几种情况都会发生堵塞,一旦发生堵塞就会造成锁死
第一种情况只有发送没有接受,就会造成 blocking
ch := make(chan int)
ch <- 1
- 第二种情况没有发送只有接受,就会造成 blocking
ch := make(chan int, 3)
fmt.Println("",<-ch)
- buffered channel 一旦满了也会造成 blocking 的问题
ch := make(chan int, 3)
ch <-1
ch <-2
ch <-3
fmt.Println("",<-ch)
fmt.Println("",<-ch)
fmt.Println("",<-ch)
- 可以用 close 来关闭 channel,但这并不是最好解决方案
ch := make(chan int, 3)
ch <-1
ch <-2
ch <-3
close(ch)
fmt.Println("",<-ch)
fmt.Println("",<-ch)
fmt.Println("",<-ch)
fmt.Println("",<-ch)
fmt.Println("",<-ch)
大家发现当关闭channel后重,动态获取值为 0
1
2
3
0
0
当调用 close 来关闭通道后,我们再从 channel 获取数据时候返回两个值
0 为 int类型默认值, false 表示该 channel 已经关闭。
val, ok := <-ch
fmt.Println("",ok)
fmt.Println("",val)
false
0