Channel创建方式:

  var c1 chan [value type]

  c1 = make([channel type] [value type], [capacity])

 

[value type] 定义的是 Channel 中所传输数据的类型。

[channel type] 定义的是 Channel 的类型,其类型有以下三种:

  "chan" 可读可写 : chan int 则表示可读写 int 数据的 channel

  "chan<-" 仅可写 : chan<- float64 则表示仅可写64位 float 数据的 channel

  "<-chan" 仅可读 : <-chan int 则表示仅可读 int 数据的 channel

[capacity] 是一个可选参数,其定义的是 channel 中的缓存区 (buffer)。

    如果不填则默认该 channel 没有缓冲区 (unbuffered)。

    对于没有缓冲区的 channel,消息的发送和收取必须能同时完成,否则会造成阻塞并提示死锁错误。

    

Channel死锁:对 channel 的发送和接收动作永远不会同时发生,从而阻塞造成死锁。

        fatal error: all goroutines are asleep - deadlock!

 

避免死锁方式1:使用goroutine并发执行。

           通过 go 语句定义发送操作的方程在另一个协程并发运行,chan读取没有数据时会阻塞等待,从而能够解决死锁

避免死锁方式2:使用 buffer。

        为 channel 添加一个缓冲区(buffer),这样只要 buffer 没有用尽,阻塞就不会发生,死锁也不会发生。

Example:chan.go

 

同样的,在 select 控制结构中,如果两个 channel 都阻塞且没有 default 流程分支时,也将产生死锁(deadlock)。

Example:select.go

 

本文基于 署名-非商业性使用 4.0 许可协议发布, 允许转载, 演绎, 但是必须保留本文的署名 ercom (包含链接 http://www.cnblogs.com/farwish/), 且不得用于商业目的。如您有任何疑问或者授权方面的协商, 请与我联系。