channel使用惯例

通道具有以下性质:

  • nil通道发送数据会永久阻塞

  • nil通道接收数据会永久阻塞

  • 向已关闭的通道发送会引发恐慌

  • 从已关闭的通道接收会立刻返回零值

向nil通道发送数据会永久阻塞

package main

func main() {
        var ch chan bool
        ch <- true // deadlocks because ch is nil
}

---------Output-----------
fatal error: all goroutines are asleep - deadlock!

通道没有初始化值则为nil,所以上述程序会永久阻塞(发生死锁)。

上述代码并无利用价值,它属于缺陷(Bug)。请不要这样做

从nil通道接收数据会永久阻塞

package main

import "fmt"

func main() {
	var ch chan bool
	fmt.Printf("Value received from ch is: %v\n", <-ch) // deadlock because ch is nil
}

--------Output---------
fatal error: all goroutines are asleep - deadlock!

类似的,这也会引发死锁,是Bug,请不要这样做

向已关闭通道发送会引发恐慌

package main

import (
	"fmt"
	"time"
)

func main() {
	var ch = make(chan int, 100)
	go func() {
		ch <- 1
		time.Sleep(time.Second)
		close(ch)
		ch <- 1
	}()
	for i := range ch {
		fmt.Printf("i: %d\n", i)
	}
}

最后更新于