go中有緩衝通道和無緩衝通道區別

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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)}

 可以在部分代碼注釋掉,看效果,再體會下

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.