Home
Posts
Tag
About
golang中channel的一些说明
golang中channel的一些说明
2018-05-31 18:08:02
#go
#channel
channel是消息传递的机制,用于多线程环境下lock free synchronization. 它同时具备2个特性:消息传递、同步。channel是类型相关的,同一个channel中只能传递同一种数据类型 ``` var chanName chan ElementType // 声明一个channel /* 单向channel */ chan<- ElementType // 表示只能向这个channel写数据 <-chan ElementType // 表示只能从这个channel中读数据 ``` ### 消息传递 带有缓冲区的channel一般用来做不同goroutine之间的消息传递。最经典的解释莫过于生产者-消费者了。 生产者向channel中写数据,如果channel缓冲区已满,则生产者会被***阻塞***直到消费者消费缓冲区中的数据后才能被唤醒。 消费者从channel中读取数据,如果缓冲区中没有任何数据则消费者会***阻塞***直到生产者将数据写入才能被唤醒。 ### 同步 创建channel时可以提供一个可选的整型参数,用于设置该channel的缓冲区大小。该值缺省为0,用来构建默认的“无缓冲channel”,也称为“同步channel”。如果channel是无缓冲的,发送方会一直阻塞直到接收方将数据取出。 ``` ch := make(chan int,bufferSize) // bufferSize为缓冲区的大小,可以不传递该值代表不带缓冲区的channel ``` ### 特殊状态的channel ##### 1. 未初始化的channel ``` var ch chan int ch<-1 // 永远阻塞 <- ch // 永远阻塞 close(ch) // panic close of nil channel ``` ##### 2. 已关闭的channel + 向已关闭的channel中写数据会导致panic。 + 关闭一个已关闭的channel会导致panic。 + 从已关闭的channel中读数据***不会***导致panic,会返回该数据类型的零值。从channel中读数据支持两个返回值得形式 ```i,ok <- ch``` ok是一个bool值。可通过这个bool值来判断channel是否已经被关闭。在channel中读取到零值也不等于channel已经被关闭 ``` ch := make(chan int,3) ch <-1 ch <-0 ch <-3 i,ok <- ch //i为1,ok为true(channel未关闭) close(ch) j,ok <- ch //j是0,ok为true(channel虽然被关闭了,但是缓存中仍然有数据,j为0并不能判断出channel已关闭) m,ok <- ch //m是3不是0,ok为true(channel虽然被关闭了,但是缓存中仍然有数据) n,ok <-ch //n是0,ok为false (表示channel关闭并且缓冲区中没有数据了,n被赋值为该类型的零值) ``` 参考资料: [《深度剖析channel》- shanks's Blog](http://shanks.leanote.com/post/%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90channel)