Channel可以被close,用于关闭channel,随后对基于该channel的任何发送操作都将导致panic异常。对一个已经被close过的channel进行接收操作依然可以接受到之前已经成功发送的数据;如果channel中已经没有数据的话将产生一个零值的数据。
    Channel的不同于文件,不使用时不需要close,close通常用于一些消息的通知(如终止range循环)

    1. type People struct {
    2. Age int
    3. Name string
    4. }
    5. func main() {
    6. c := make(chan People)
    7. close(c)
    8. e1 := <- c
    9. e2 := <- c
    10. fmt.Println(e1)
    11. fmt.Println(e2)
    12. c <- e1
    13. }

    截屏2021-12-16 17.50.31.png
    Channel的close可以用于广播通知,因为从被close的channel中接收消息会返回0值。

    1. func process(i int, done <-chan struct{}, wg *sync.WaitGroup) {
    2. defer wg.Done()
    3. tick := time.Tick(1 * time.Second)
    4. for {
    5. select {
    6. case <-tick:
    7. fmt.Println(i)
    8. case <-done:
    9. fmt.Println("Done")
    10. return
    11. }
    12. }
    13. }
    14. func main() {
    15. wg := sync.WaitGroup{}
    16. done := make(chan struct{})
    17. for i := 0; i < 3; i++ {
    18. wg.Add(1)
    19. go process(i, done, &wg)
    20. }
    21. time.Sleep(3 * time.Second + 500 * time.Millisecond)
    22. close(done)
    23. wg.Wait()
    24. }

    以上的示例通过一个done channel来终止全部的process线程。