標籤:
golang channel 有緩衝 與 無緩衝 是有重要區別的
我之前天真的認為 有緩衝與無緩衝的區別 只是 無緩衝的 是 預設 緩衝 為1 的緩衝式
其實是徹底錯誤的,無緩衝的與有緩衝channel有著重大差別
那就是一個是同步的 一個是非同步的
怎麼說?比如
c1:=make(chan int) 無緩衝
c2:=make(chan int,1) 有緩衝
c1<-1
無緩衝的 不僅僅是 向 c1 通道放 1 而是 一直要有別的攜程 <-c1 接手了 這個參數,那麼c1<-1才會繼續下去,要不然就一直阻塞著
而 c2<-1 則不會阻塞,因為緩衝大小是1 只有當 放第二個值的時候 第一個還沒被人拿走,這時候才會阻塞。
打個比喻
無緩衝的 就是一個送信人去你家門口送信 ,你不在家 他不走,你一定要接下信,他才會走。
無緩衝保證信能到你手上
有緩衝的 就是一個送信人去你家仍到你家的信箱 轉身就走 ,除非你的信箱滿了 他必須等信箱空下來。
有緩衝的 保證 信能進你家的郵箱
看測試代碼
有緩衝的
1 package main 2 3 import "fmt" 4 5 var c = make(chan int, 1) 6 7 func f() { 8 9 c <- ‘c‘10 11 fmt.Println("在goroutine內")12 }13 14 func main() {15 go f()16
17 c <- ‘c‘18 <-c19 <-c20 21 fmt.Println("外部調用")22 }
無緩衝的
// pppackage mainimport ( "fmt")func writeRoutine(test_chan chan int, value int) { test_chan <- value}func readRoutine(test_chan chan int) { <-test_chan return}func main() { c := make(chan int) x := 100 //readRoutine(c) //go writeRoutine(c, x) //writeRoutine(c, x) //go readRoutine(c) //go readRoutine(c) //writeRoutine(c, x) go writeRoutine(c, x)
go writeRoutine(c, x) readRoutine(c) fmt.Println(x)}
可以在部分代碼注釋掉,看效果,再體會下
go中有緩衝通道和無緩衝通道區別