ch3 := make(chan int, 3) wg.Add(1) go func() { for i := 1; i < 3; i++ { ch3 <- i } close(ch3) close(ch3) // panic: close of closed channel wg.Done() }() wg.Wait()
ch4 := make(chan int, 5) wg.Add(1) go func() { for i := 1; i < 5; i++ { ch4 <- i } close(ch4) ch4 <- 5 // panic: send on closed channel wg.Done() }() wg.Wait()
ch2 := make(chan int) go func() { ch2 <- 1 close(ch2) }() for i := 0; i < 3; i++ { v, ok := <-ch2 fmt.Println(i, v, ok) }
怎么区分是缓存中的 0 值,还是因为关闭后返回的 0 值
通过 value, ok := ←chan
如果 ok 为 true 的时候就是缓存中的 0 值
否则是因为关闭后返回的 0 值
ch1 := make(chan int, 3) wg := sync.WaitGroup{} wg.Add(1) go func() { for i := 1; i < 3; i++ { ch1 <- i } close(ch1) wg.Done() }() wg.Wait() for i := 1; i < 5; i++ { v, ok := <- ch1 fmt.Println(i, v, ok) }
- 本文固定链接: https://117.119.65.11:10064/?id=1965
- 转载请注明: admin 于 PHP面试网 发表
《本文》有 0 条评论