五、channel

(1)Channel读写特性(15字口诀)

首先,我们先复习一下Channel都有哪些特性?

  • 给一个 nil channel 发送数据,造成永远阻塞

  • 从一个 nil channel 接收数据,造成永远阻塞

  • 给一个已经关闭的 channel 发送数据,引起 panic

  • 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值

  • 无缓冲的channel是同步的,而有缓冲的channel是非同步的

以上5个特性是死东西,也可以通过口诀来记忆:“空读写阻塞,写关闭异常,读关闭空零”。

执行下面的代码发生什么?

test17.go

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. ch := make(chan int, 1000)
  8. go func() {
  9. for i := 0; i < 10; i++ {
  10. ch <- i
  11. }
  12. }()
  13. go func() {
  14. for {
  15. a, ok := <-ch
  16. if !ok {
  17. fmt.Println("close")
  18. return
  19. }
  20. fmt.Println("a: ", a)
  21. }
  22. }()
  23. close(ch)
  24. fmt.Println("ok")
  25. time.Sleep(time.Second * 100)
  26. }

15字口诀:“空读写阻塞,写关闭异常,读关闭空零”,往已经关闭的channel写入数据会panic的。因为main在开辟完两个goroutine之后,立刻关闭了ch, 结果:

  1. panic: send on closed channel