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()
}