Channel可以被close,用于关闭channel,随后对基于该channel的任何发送操作都将导致panic异常。对一个已经被close过的channel进行接收操作依然可以接受到之前已经成功发送的数据;如果channel中已经没有数据的话将产生一个零值的数据。
Channel的不同于文件,不使用时不需要close,close通常用于一些消息的通知(如终止range循环)
type People struct {Age intName string}func main() {c := make(chan People)close(c)e1 := <- ce2 := <- cfmt.Println(e1)fmt.Println(e2)c <- e1}

Channel的close可以用于广播通知,因为从被close的channel中接收消息会返回0值。
func process(i int, done <-chan struct{}, wg *sync.WaitGroup) {defer wg.Done()tick := time.Tick(1 * time.Second)for {select {case <-tick:fmt.Println(i)case <-done:fmt.Println("Done")return}}}func main() {wg := sync.WaitGroup{}done := make(chan struct{})for i := 0; i < 3; i++ {wg.Add(1)go process(i, done, &wg)}time.Sleep(3 * time.Second + 500 * time.Millisecond)close(done)wg.Wait()}
以上的示例通过一个done channel来终止全部的process线程。
