make(chan int) 和 make(chan int, 1) 的區(qū)別

弄懂了下面的這個例子你就懂了

package main

import "fmt"

func main() {
    var c = make(chan int)
    var a string

    go func() {
        a = "hello world"
        <-c
    }()

    c <- 0
    fmt.Println(a)
}

上面的例子會打印 "hello world"

如果改成 var c = make(chan int, 1) a 可能是 "hello world" 也可能是空,我運行了好多次基本打印的都是空

make(chan int) 是 unbuffered channel, send 之后 send 語句會阻塞執(zhí)行,直到有人 receive 之后 send 解除阻塞,后面的語句接著執(zhí)行。
所以執(zhí)行 c <- 0 時會阻塞,直到 <-c, 這時 a 已賦值。

make(chan int, 1) 是 buffered channel, 容量為 1。在 buffer 未滿時往里面 send 值并不會阻塞, 只有 buffer 滿時再 send 才會阻塞,所以執(zhí)行到 c <- 0 時并不會阻塞 fmt.Println(a) 的執(zhí)行,這時 a 可能是 "hello world" 也可能是空, 看兩個 goroutine 誰執(zhí)行的更快

我如果在 fmt.Println(a) 之前加一些耗時操作,很有可能打印的還是 "hello world", 因為給 a 賦值的語句已經(jīng)執(zhí)行完了

func main() {
    var c = make(chan int, 1)
    var a string

    go func() {
        a = "hello world"
        <-c
    }()

    c <- 0
    // 模擬耗時操作
    sum := 0
    for i := 0; i < 100000; i++ {
        sum += i*23 + 45 - 7*4/2 - 99
    }
    fmt.Println(a)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 01.{ 換行: Opening Brace Can't Be Placed on a Separate Lin...
    碼農(nóng)不器閱讀 2,477評論 0 14
  • 能力模型 選擇題 [primary] 下面屬于關(guān)鍵字的是()A. funcB. defC. structD. cl...
    _張曉龍_閱讀 25,134評論 14 224
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,322評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Mark一下這篇文章http://m.blog.csdn.net/article/details?id=10607...
    imbird閱讀 827評論 0 0

友情鏈接更多精彩內(nèi)容