1、Curious Channels
A closed channel never blocks
A nil channel always blocks
A send to a nil channel blocks forever
A receive from a nil channel blocks forever
A send to a closed channel panics
A receive from a closed channel returns the zero value immediately
2.Never start a goroutine without knowing how it will stop
Every time you write the statement go in a program, you should consider the question of how, and under what conditions, the goroutine you are about to start, will end.
select 会依照随机的程序检测各 case 语句中 channel 是否 ready,如果某个 case 中的 channel 曾经 ready 则执行相应的 case 语句而后退出 select 流程,如果所有的 channel 都未 ready 且没有 default 的话,则会阻塞期待各个 channel
channel 不须要通过 close 开释资源,只有没有 goroutine 持有 channel,相干资源会主动开释。
close 能够用来告诉 channel 接收者不会再收到数据。所以即便 channel 中有数据也能够 close 而不会导致接收者收不到残留的数据。
有些场景须要敞开通道,例如 range 遍历通道,如不敞开 range 遍历会呈现死锁。
敞开 channel 个别是用来告诉其余协程某个工作曾经实现了。
援用:
https://dave.cheney.net/2016/…
https://dave.cheney.net/2013/…
https://dave.cheney.net/2014/…
The Behavior Of Channels:
https://www.ardanlabs.com/blo…