【Duke】channel地关闭和广播 025 - PingPongGooo/GoFoundation GitHub Wiki

channel的关闭

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

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

func service() string{
	time.Sleep(time.Millisecond * 500) // 耗时操作
	//time.Sleep(time.Millisecond * 50) // 耗时操作

	return "Done"
}

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

func dataReceiver(ch chan int, wg *sync.WaitGroup){
	go func() {
		for i := 0; i < 10; i++ {
			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()

}