作者回复: 好问题! channel内部数据是排队的,即便被close,依然可以从closed channel中读取到尚未被消费的元素,直到没有可读的元素为止,才真正会变成closed状态。没数据后,如果再读就会得到元素类型的零值了, 对于没数据且closed状态的channel,for range会终止。
作者回复: channel一旦没有人引用了,就会被gc掉,不关闭也ok。但是如果有goroutine一直在读channel,那么channel一直存在,不会关闭。直到程序退出。
作者回复: close一个channel后,所有阻塞在这个channel接收操作的goroutine都会收到通知,这是Go语言的channel语义就这么定义的。
作者回复: 👍
作者回复: Wait方法的语义就是等待例子中for循环创建的所有子goroutine,直到每个子goroutine都调用完wg.Done才返回。如果不再一个新goroutine执行,wg.Wait就会阻塞住main goroutine,这也将导致后续所有goroutine都阻塞住,然后go运行时检测到所有goroutine都阻塞住了,于是报错退出。
作者回复: 首先明确一点:channel如果不close,也不会存在资源泄露的问题。 是否需要close channel完全看需要。 至于如何知道何时需要,看文中对close channel的语义的描述,以及如何基于这种语义的一些妙用。
作者回复: 👍
作者回复: 👍
作者回复: 如果channel中的元素大小为0,那就不需要额外分配缓存(buf); 如果元素类型中不含有指针,那么buf就和hchan一起分配(将来也和hchan一起释放),减少一次heap mem分配。GC只扫描hchan就ok了。 如果元素类型包含指针,那么hchan和hchan.buf单独分配内存,GC分别扫描hchan和buf中的元素。
作者回复: 由于箭头都是向左的,即<-,所以我区分只发送和只接收型的channel的tip是以 chan这个关键字为中心,将chan关键字看成一个“管子”。当<-在chan的右边,即chan <- 好似向管子里写,这样就是只发送型。当<-在chan的左边,即<- chan ,好似从管子里取,这样就是只接收型。