chan close
chan close 不会阻塞
在 Go 中,当从一个已关闭的通道中接收数据时,不会发生阻塞。相反,你会立即收到通道的“零值”和一个 false 的布尔值,表示通道已关闭。
在你的代码中:
- 第一次从通道接收时,通道中有一个值
2,所以接收到2和true。 - 关闭通道后,再次尝试接收。
- 因为通道已关闭,接收操作立即返回通道元素类型的零值(对于
int类型是0)和false。
这就是为什么第二个接收没有阻塞并继续执行的原因。
code
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1)
ch <- 2
val, ok := <-ch
fmt.Printf("Val: %d OK: %t\n", val, ok)
close(ch)
val, ok = <-ch
fmt.Printf("Val: %d OK: %t\n", val, ok)
}
// 这里为什么第二个接收没有阻塞,而是继续执行?