优雅关闭 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")
}
posted @ 2024-06-18 10:18  Aloe_n  阅读(2)  评论(0编辑  收藏  举报