5、channel

最后更新于:2022-04-02 08:15:34

[TOC] ## 五、channel ### (1)Channel读写特性(15字口诀) 首先,我们先复习一下Channel都有哪些特性? * 给一个 nil channel 发送数据,造成永远阻塞 * 从一个 nil channel 接收数据,造成永远阻塞 * 给一个已经关闭的 channel 发送数据,引起 panic * 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值 * 无缓冲的channel是同步的,而有缓冲的channel是非同步的 以上5个特性是死东西,也可以通过口诀来记忆:“空读写阻塞,写关闭异常,读关闭空零”。 > 执行下面的代码发生什么? > test17.go ```go 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) } ``` 15字口诀:“空读写阻塞,写关闭异常,读关闭空零”,往已经关闭的channel写入数据会panic的。因为main在开辟完两个goroutine之后,立刻关闭了ch, 结果: ``` panic: send on closed channel ```
';