func main() { closeReadChan() closeWriteChan() closeReadChan2() }
// 从有缓冲被关闭的chan写数据, 报错: panic: send on closed channel func closeWriteChan() { wg := sync.WaitGroup{} ch := make(chan int, 100) wg.Add(2) go func() { defer wg.Done() close(ch) }() time.Sleep(time.Second * 2) go func() { defer wg.Done() for i := 1; i <= 100; i++ { ch <- i } }() wg.Wait() } // 从无缓存被close的channel中读数据, 可正常读取 func closeReadChan2() { wg := sync.WaitGroup{} ch := make(chan string) wg.Add(2) go func() { defer wg.Done() for i := 1; i <= 100; i++ { ch <- fmt.Sprintf("%v%v", i, time.Now().String()) } close(ch) }() time.Sleep(time.Second * 2) for x := range ch { fmt.Println(x) } wg.Done() wg.Wait() } // 从有缓存被close的channel中读数据, 可正常读出数据 func closeReadChan() { wg := sync.WaitGroup{} ch := make(chan int, 100) wg.Add(2) go func() { defer wg.Done() for i := 1; i <= 100; i++ { ch <- i } close(ch) }() time.Sleep(time.Second * 5) go func() { defer wg.Done() for x := range ch { fmt.Println(x) } }() wg.Wait() }