通过关闭 channel 来终止 range 循环。
var=声明的信道并不会初始化,通过make创建的 channel 会初始化。
c := make(chan int)var cc chan intfmt.Printf("%T, %v", c, c) // chan int, 0xc000016180fmt.Printf("%T, %v", cc, cc) // chan int, <nil>
可以看出 channel 的背后也是指针,所以传参的时候不用取地址。
make(chan int) vs make(chan int, 1)
前者是普通管道;后者是缓冲管道,1 为缓冲大小。
普通管道没有任何缓冲区,所以当放了数据之后,放数据的那个协程就进入阻塞直至另外一个协程取出数据。
deadlock 与 零值
向一个已经关闭的管道,并且管道中没有数据,那么从管道中取出数据时不阻塞但返回零值。
向一个未关闭的管道,并且管道中没有数据,则当前协程进入阻塞,当没有协程向管道塞数据就导致 deadlock。
