优雅关闭 channel
优雅关闭 channel
不使用select, 不借助额外channel.
package main
import (
"fmt"
"sync"
)
func main() {
data_c := make(chan string, 10)
// producer group
go func() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
data_c <- fmt.Sprintf("s_%d", i)
wg.Done()
}(i)
}
wg.Wait()
// close chan after all producer is finished
close(data_c)
}()
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func(i int) {
for d := range data_c {
fmt.Printf("r_%d receive %s\n", i, d)
}
wg.Done()
}(i)
}
wg.Wait()
fmt.Println("done")
}