Skip to main content

chan close

chan close 不会阻塞

在 Go 中,当从一个已关闭的通道中接收数据时,不会发生阻塞。相反,你会立即收到通道的“零值”和一个 false 的布尔值,表示通道已关闭。

在你的代码中:

  1. 第一次从通道接收时,通道中有一个值 2,所以接收到 2true
  2. 关闭通道后,再次尝试接收。
  3. 因为通道已关闭,接收操作立即返回通道元素类型的零值(对于 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)
}
// 这里为什么第二个接收没有阻塞,而是继续执行?