golang chan 踩坑 通道特性

2021-09-16 13:40:34 字數 1003 閱讀 2476

golang 在協程中都會用到chan 用於資料同步,在併發場景下一般都會使用到這個,簡單場景就是乙個讀取,乙個寫入,所以chan都是成對出現的,現在主要來說明一下有緩衝和無緩衝的場景對比。

ch1:=make(chan int)        無緩衝

ch2:=make(chan int,1)      有緩衝

ch1<- 5                            

無緩衝的 不僅僅是 向 ch1 通道放 乙個int型別資料 而是 一直要有別的攜程 <-ch1 接手了 這個引數,那麼ch1<-5才會繼續下去,要不然就一直阻塞著,所以他是讀寫阻塞

而 ch2<-1 則不會阻塞,因為緩衝大小是1 只有當 放第二個值的時候 第乙個還沒被人拿走,這時候才會阻塞。

打個比喻

無緩衝的  就是乙個送信人去你家門口送信 ,你不在家 他不走,你一定要接下信,他才會走。

無緩衝保證信能到你手上

有緩衝的 就是乙個送信人去你家仍到你家的信箱 轉身就走 ,除非你的信箱滿了 他必須等信箱空下來。

有緩衝的 保證 信能進你家的郵箱

總結:有快取通道的特點是,有快取時可以向通道中寫入資料後直接返回,快取中有資料時可以從通道中讀到資料直接返回,這時有快取通道是不會阻塞的,它阻塞的場景是:

通道的快取無資料,但執行讀通道。讀被阻塞

通道的快取已經佔滿,向通道寫資料,但無協程讀,寫被阻塞

無緩衝通道的特點是,傳送的資料需要被讀取後,傳送才會完成,它阻塞場景:

通道中無資料,但執行讀通道。讀被阻塞

通道中無資料,向通道寫資料,但無協程讀取。

另外chan無快取的是先進先出,**如下:

var ch chan int = make(chan int)

func foo(id int)

func testi(t *testing.t)

// 取出通道中的資料

for i := 0; i < 5; i++

}

golang chan 單項通道與多項通道

package main import fmt func main 雙項通道 var read test chan inte ce 單項通道 只支援 讀 var write test chan inte ce 單項通道 只支援 寫 read test xiao 會報錯。因為這個通道 只是單項通道只支...

Go語言高能踩坑記錄 通道

使用go通道,經常會遇到死鎖錯誤,根據我所遇到做了以下整理 fatal error all goroutines are asleep deadlock 看下面這段 package main import fmt func main 執行會丟擲錯誤,如下 fatal error all gorout...

systemtap embedded C 踩坑筆記

官方文件 systemtap的embedded c中,不能 include 也不能用printf和print。那怎麼列印呢?用stap printf。用法與printf一樣。還可以訪問cript中的全域性變數。官方文件中的示例 global var global var2 100 function ...