goutine特殊情况记录
select
发现此条件下,可以执行的case的选取是随机的
func main() {
c1 := make(chan int, 1)
c2 := make(chan int, 1)
c3 := make(chan int, 1)
c1 <- 1
c2 <- 2
c3 <- 3
select {
case tmp := <-c1:
fmt.Println(tmp)
case tmp := <-c2:
fmt.Println(tmp)
case tmp := <-c2:
fmt.Println(tmp)
}
}
原理等查明后更新,希望有人能指导解答。
select中如果任意某个通道有值可读时,它就会被执行,其他被忽略。
如果没有default字句,select将有可能阻塞,直到某个通道有值可以运行,所以select里最好有一个default,否则将有一直阻塞的风险。
通道关闭后情况
关闭后有无缓存的通道,都无法写入。
但无缓存chan再关闭后,如果通道内没有值可以读取到0,有值会死锁
有值
func main() {
c1 := make(chan int)
c1 <- 1
close(c1)
fmt.Println(<-c1)
}
无值
func main() {
c1 := make(chan int)
close(c1)
fmt.Println(<-c1)
}
有缓存通道关闭后可以读取,没值的时候会读取到0
range遍历,只有在有缓存通道关闭后才能使用
这个不做演示。
持续更新记录