golang 之 channel
阿新 • • 發佈:2017-05-14
microsoft 沒有 而已 創建 無緩沖 eight 不能 否則 false
channel的機制是先進先出
無緩沖的channel: 如果你給channel賦值了,那麽必須要讀取它的值,不然就會造成阻塞。
chreadandwrite :=make(chan int) chonlyread := make(<-chan int) //創建只讀channel chonlywrite := make(chan<- int) //創建只寫channel
有緩沖的channel: 發送方會一直阻塞直到數據被拷貝到緩沖區;
如果緩沖區已滿,則發送方只能在接收方取走數據後才能從阻塞狀態恢復。
ch :=make(chan int,1)
- 關於Channel的心得【摘抄】
- 首先,永遠是符號
<-
進行讀取或者寫入,譬如v,ok := <-c
是讀取,而c <- v
是寫入。 - 其次,讀取時,如果沒有ok,也是可以讀取的。不過如果closed也是能讀的,沒有賦值而已;如果要知道是否closed得加ok,也就是除非chan永遠不關閉,否則讀取應該用
v,ok := <-c
而不是用v := <-c
的方式。 - 再次,不能向closed的chan寫入,所以一般寫入時需要用一個信號的chan(一般buffer為1),來判斷是否寫入或者放棄,用select判斷是寫入成功了,還是正在關閉需要放棄寫入。
- 最後,如果closed後,chan有數據,ok還是true的,直到chan沒有數據了才false。
golang 之 channel