【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()
}