range 和 close

发送者可通过 close 关闭一个信道来表示没有需要发送的值了。接收者可以通过为接收表达式分配第二个参数来测试信道是否被关闭:若没有值可以接收且信道已被关闭,那么在执行完

  1. v, ok := <-ch

之后 ok 会被设置为 false

循环 for i := range c 会不断从信道接收值,直到它被关闭。

注意: 只有发送者才能关闭信道,而接收者不能。向一个已经关闭的信道发送数据会引发程序恐慌(panic)。

还要注意: 信道与文件不同,通常情况下无需关闭它们。只有在必须告诉接收者不再有需要发送的值时才有必要关闭,例如终止一个 range 循环。

range-and-close.go

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func fibonacci(n int, c chan int) {
  6. x, y := 0, 1
  7. for i := 0; i < n; i++ {
  8. c <- x
  9. x, y = y, x+y
  10. }
  11. close(c)
  12. }
  13. func main() {
  14. c := make(chan int, 10)
  15. go fibonacci(cap(c), c)
  16. for i := range c {
  17. fmt.Println(i)
  18. }
  19. }