Go语言学习笔记-并发编程-channel的关闭和广播

  1. 向关闭的channel发送数据,会导致panic
  2. v,ok <-ch;ok为bool值,true表示正常接受,false表示通道关闭
  3. 所有的channel接收者都会在channel关闭时,立刻从阻塞等待中返回并返回且上述ok值为false。这个广播机制常被利用,进行向多个接收者同时发送信号。如退出信号
package channel_close

import (
    "fmt"
    "sync"
    "testing"
)

func dataProducer(ch chan int, wg *sync.WaitGroup) {
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
        close(ch)

        wg.Done()
    }()

}

func dataReceiver(ch chan int, wg *sync.WaitGroup) {
    go func() {
        for {
            if data, ok := <-ch; ok {
                fmt.Println(data)
            } else {
                break
            }
        }
        wg.Done()
    }()

}

func TestCloseChannel(t *testing.T) {
    var wg sync.WaitGroup
    ch := make(chan int)
    wg.Add(1)
    dataProducer(ch, &wg)
    wg.Add(1)
    dataReceiver(ch, &wg)
    // wg.Add(1)
    // dataReceiver(ch, &wg)
    wg.Wait()

}

你可能感兴趣的:(Go语言学习笔记-并发编程-channel的关闭和广播)