-
安全地读取一个chan,在chan被关闭时自动退出
ch := make(chan)
// 方式1:for-range
for val := range ch
// 方式2: comma-ok语法
val, ok := <- ch
-
实现一个单生产者多消费者的生产-消费模型
func main() {
dataChan := make(chan int, 0)
wg := sync.WaitGroup{}
wg.Add(6)
go producer(dataChan, &wg)
for i := 0; i < 5; i++ {
go consumer(dataChan, &wg)
}
wg.Wait()
fmt.Println("finish")
}
func producer(in chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
// 在生产端进行控制
for i := 0; i < 50; i++ {
in <- 1
fmt.Printf("produce count: %d\n", i+1)
}
// 关闭chan
close(in)
}
func consumer(out <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
// chan未关闭时,无值会阻塞,chan关闭后会跳出循环
for val := range out {
fmt.Printf("consume %d\n", val)
}
//for {
// val, ok := <- out
// if !ok {
// break
// }
// fmt.Printf("consume %d\n", val)
//}
}
-
其他用法 可以chan作为一个缓存层来使用,如写入文件时,可以先写入到指定chan,再通过goroutine一步写入到文件中。 接收事件结果并实现回调机制,可参考samara库的实现