通过关闭 channel 来终止 range 循环。

var=声明的信道并不会初始化,通过make创建的 channel 会初始化。

  1. c := make(chan int)
  2. var cc chan int
  3. fmt.Printf("%T, %v", c, c) // chan int, 0xc000016180
  4. fmt.Printf("%T, %v", cc, cc) // chan int, <nil>

可以看出 channel 的背后也是指针,所以传参的时候不用取地址。

make(chan int) vs make(chan int, 1)

前者是普通管道;后者是缓冲管道,1 为缓冲大小。
普通管道没有任何缓冲区,所以当放了数据之后,放数据的那个协程就进入阻塞直至另外一个协程取出数据。

deadlock 与 零值

向一个已经关闭的管道,并且管道中没有数据,那么从管道中取出数据时不阻塞但返回零值。
向一个未关闭的管道,并且管道中没有数据,则当前协程进入阻塞,当没有协程向管道塞数据就导致 deadlock。