channel 的关闭
向关闭的channel发送数据,会panic
v, ok := <- ch; ok 为bool值,true 表示正常接收,false表示通道关闭
所有的channel的接收者都会在channel关闭时,立即从阻塞
等待中返回,且上述ok值为false。这个广播机制常被利用,进行多个订阅者同时发送信号。
如:退出信号。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
ch := make(chan struct{})
wg := sync.WaitGroup{}
for i := 1; i < 10; i++ {
wg.Add(1)
go Do(ch,i,&wg)
}
time.AfterFunc(
time.Millisecond*500, func() {
close(ch)
},
)
wg.Wait()
fmt.Println("main EXIT")
}
func IsClosed(ch chan struct{})bool{
select {
case <-ch:
return true
default:
return false
}
}
func Do(ch chan struct{}, num int,wg *sync.WaitGroup) {
defer wg.Done()
for ; !IsClosed(ch); {
time.Sleep(time.Millisecond*500)
fmt.Println(num,"online")
}
fmt.Println(num,"EXIT")
}