执行下面的代码会发生什么?
package main import ( "fmt" "time" ) func main() { ch := make(chan int, 1000) go func() { for i := 0; i < 10; i++ { ch <- i } }() go func() { for { a, ok := <-ch if !ok { fmt.Println("close") return } fmt.Println("a: ", a) } }() close(ch) fmt.Println("ok") time.Sleep(time.Second * 100) } 答案解析:
记住 channel 的一些关键特性:
- 给一个 nil channel 发送数据,造成永远阻塞
- 从一个 nil channel 接收数据,造成永远阻塞
- 给一个已经关闭的 channel 发送数据,引起 panic
- 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
- 无缓冲的channel是同步的,而有缓冲的channel是非同步的
本题中,因为 main 在开辟完两个 goroutine 之后,立刻关闭了 ch, 结果就是 panic:
panic: send on closed channel
备注:文章内容来自本站go每日一题
有疑问加站长微信联系(非本文作者)
