最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解golang channel有無(wú)緩沖區(qū)的區(qū)別

 更新時(shí)間:2024年01月29日 10:47:07   作者:壯Sir不壯  
這篇文章主要給大家介紹了golang channel有無(wú)緩沖區(qū)的區(qū)別,無(wú)緩沖是同步的,有緩沖是異步的,文中通過(guò)代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下

有無(wú)緩沖的區(qū)別

形象說(shuō)明一下無(wú)緩沖和有緩沖的區(qū)別:

無(wú)緩沖是同步的,例如 make(chan int),就是一個(gè)送信人去你家門(mén)口送信,你不在家他不走,你一定要接下信,他才會(huì)走,無(wú)緩沖保證信能到你手上。

有緩沖是異步的,例如 make(chan int, 1),就是一個(gè)送信人去你家仍到你家的信箱,轉(zhuǎn)身就走,除非你的信箱滿了,他必須等信箱空下來(lái),有緩沖的保證信能進(jìn)你家的郵箱。

channel 無(wú)緩沖

例1:

func main() {
    ch := make(chan int)
    ch <- 1 // 報(bào)錯(cuò),因?yàn)閏h 無(wú)緩沖,存一個(gè)就必須立即取出來(lái)
    fmt.Println(<- ch)
}

改正:

func main() {
    ch := make(chan int)
    go tt(ch) // 開(kāi)一個(gè) goroutine
    fmt.Println("我先執(zhí)行1111")
    fmt.Println(<-ch) // 因?yàn)榍懊骈_(kāi)了一個(gè) goroutine, 這一行比 go tt(ch) 先執(zhí)行,這里堵塞了,等到 tt(ch) 中的語(yǔ)句執(zhí)行完之后,本行執(zhí)行
    // 我先執(zhí)行1111
    // 我先執(zhí)行2222
    // 1
}
 
func tt(ch chan int) {
    fmt.Println("我先執(zhí)行2222")
    ch <- 1
}

例2:

package main
 
import "fmt"
 
func main() {
    ch := make(chan int) // 無(wú)緩沖的channel
    go unbufferChan(ch)
 
    for i := 0; i < 10; i++ {
        fmt.Println("receive ", <-ch) // 讀出值
    }
}
 
func unbufferChan(ch chan int) {
    for i := 0; i < 10; i++ {
        fmt.Println("send ", i)
        ch <- i // 寫(xiě)入值
    }
}
 
// 輸出
// send  0
// send  1
// receive  0
// receive  1
// send  2
// send  3
// receive  2
// receive  3
// send  4
// send  5
// receive  4
// receive  5
// send  6
// send  7
// receive  6
// receive  7
// send  8
// send  9
// receive  8
// receive  9

channel 帶緩存

例1:

放的速度較快,先放滿了 5 個(gè),阻塞住;取的速度較慢,放了5個(gè)才開(kāi)始取,由于緩沖區(qū)已經(jīng)滿了,所以取出一個(gè)之后,才能再次放入;放完了之后雖然緩沖區(qū)關(guān)閉了,但是緩沖區(qū)的內(nèi)容還保留,所以還能繼續(xù)取出

func put(c chan int) {
    for i := 0; i < 10; i++ {
       c <- i
       time.Sleep(100 * time.Millisecond)
       fmt.Println("->放入", i)
    }
    fmt.Println("=所有的都放進(jìn)去了!關(guān)閉緩沖區(qū),但是里面的數(shù)據(jù)不會(huì)丟失,還能取出。")
    close(c)
}
 
func main() {
    ch := make(chan int, 5)
    go put(ch)
    for {
       time.Sleep(1000 * time.Millisecond)
       data, ok := <-ch
       if ok == true {
          fmt.Println("<-取出", data)
       } else {
          break
       }
    }
}
 
// ->放入 0
// ->放入 1
// ->放入 2
// ->放入 3
// ->放入 4
// <-取出 0
// ->放入 5
// <-取出 1
// ->放入 6
// <-取出 2
// ->放入 7
// <-取出 3
// ->放入 8
// <-取出 4
// ->放入 9
// =所有的都放進(jìn)去了!關(guān)閉緩沖區(qū),但是里面的數(shù)據(jù)不會(huì)丟失,還能取出。
// <-取出 5
// <-取出 6
// <-取出 7
// <-取出 8
// <-取出 9

例2:一邊存,一邊取

package main
 
import"fmt"
 
var c = make(chan int, 5)
 
func main() {
    go worker(1)
    for i := 1; i < 10; i++ {
       c <- i
       fmt.Println(i)
       fmt.Println("cap = ", cap(c), " len = ", len(c))
    }
}
 
func worker(id int) {
    for {
       _ = <-c
    }
}
 
// 運(yùn)行輸出:
// 1
// cap =  5  len =  0
// 2
// cap =  5  len =  0
// 3
// cap =  5  len =  1
// 4
// cap =  5  len =  2
// 5
// cap =  5  len =  0
// 6
// cap =  5  len =  1
// 7
// cap =  5  len =  2
// 8
// cap =  5  len =  2
// 9
// cap =  5  len =  0

到此這篇關(guān)于詳解golang channel有無(wú)緩沖區(qū)的區(qū)別的文章就介紹到這了,更多相關(guān)golang channel緩沖區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • go-zero數(shù)據(jù)的流處理利器fx使用詳解

    go-zero數(shù)據(jù)的流處理利器fx使用詳解

    這篇文章主要為大家介紹了go-zero數(shù)據(jù)的流處理利器fx使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • go run main.go 一直提示找不到包的解決方案

    go run main.go 一直提示找不到包的解決方案

    這篇文章主要介紹了go run main.go 一直提示找不到包的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang中對(duì)json的優(yōu)雅處理方式

    Golang中對(duì)json的優(yōu)雅處理方式

    這篇文章主要給大家介紹了關(guān)于Golang中對(duì)json的優(yōu)雅處理方式,解析JSON在golang中很麻煩,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Go 語(yǔ)言中和類型Sum Types的創(chuàng)新實(shí)現(xiàn)方案詳解

    Go 語(yǔ)言中和類型Sum Types的創(chuàng)新實(shí)現(xiàn)方案詳解

    本文介紹了Go語(yǔ)言中如何通過(guò)ProjectionStructs和SafeUnsafeConversion來(lái)實(shí)現(xiàn)和類型(SumTypes),該方案通過(guò)內(nèi)存布局相同的多個(gè)結(jié)構(gòu)體投影同一塊數(shù)據(jù),實(shí)現(xiàn)零自定義編解碼、編譯時(shí)類型安全和IDE自動(dòng)補(bǔ)全友好,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Go語(yǔ)言制作svg格式樹(shù)形圖的示例代碼

    Go語(yǔ)言制作svg格式樹(shù)形圖的示例代碼

    SVG是可伸縮矢量圖形?(Scalable?Vector?Graphics),于2003年1月14日成為?W3C?推薦標(biāo)準(zhǔn)。本文將利用Go語(yǔ)言實(shí)現(xiàn)制作svg格式樹(shù)形圖,感興趣的可以了解一下
    2022-09-09
  • golang 如何獲取map所有key的方式

    golang 如何獲取map所有key的方式

    這篇文章主要介紹了golang 獲取map所有key的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • GO語(yǔ)言快速入門(mén)的全面學(xué)習(xí)筆記總結(jié)(實(shí)例代碼)

    GO語(yǔ)言快速入門(mén)的全面學(xué)習(xí)筆記總結(jié)(實(shí)例代碼)

    本博客分享Go語(yǔ)言學(xué)習(xí)筆記總結(jié),助讀者快速掌握基本編碼能力,介紹了Go語(yǔ)言誕生背景、應(yīng)用場(chǎng)景,指出Java等程序員學(xué)習(xí)誤區(qū),還涵蓋環(huán)境搭建、程序結(jié)構(gòu)、常用集合、函數(shù)、面向?qū)ο缶幊?、錯(cuò)誤機(jī)制、包管理和并發(fā)編程等內(nèi)容,并給出代碼示例和驗(yàn)證
    2026-01-01
  • GO中的條件變量sync.Cond詳解

    GO中的條件變量sync.Cond詳解

    條件變量是基于互斥鎖的,它必須基于互斥鎖才能發(fā)揮作用,條件變量的初始化離不開(kāi)互斥鎖,并且它的方法有點(diǎn)也是基于互斥鎖的,這篇文章主要介紹了GO的條件變量sync.Cond,需要的朋友可以參考下
    2023-01-01
  • 詳解Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換

    詳解Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-12-12

最新評(píng)論

句容市| 邛崃市| 虎林市| 内江市| 吉安县| 青铜峡市| 新野县| 怀安县| 循化| 台州市| 晴隆县| 四川省| 贵港市| 昭觉县| 志丹县| 扎囊县| 施甸县| 古丈县| 睢宁县| 修武县| 克东县| 连山| 堆龙德庆县| 三门峡市| 鱼台县| 临沭县| 宽甸| 元谋县| 锦屏县| 蛟河市| 福泉市| 东安县| 榆社县| 凯里市| 苏尼特右旗| 安泽县| 布拖县| 安新县| 赣州市| 碌曲县| 宝兴县|