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

詳解Golang中channel的實(shí)現(xiàn)

 更新時(shí)間:2023年09月13日 09:44:24   作者:mjiarong  
channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡單高效,同時(shí)也線程安全,本文就給大家講講Golang中channel的實(shí)現(xiàn),需要的朋友可以參考下

1、channel的基本概念

channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡單高效,同時(shí)也線程安全,多個(gè)goroutine可同時(shí)修改一個(gè)channel,不需要加鎖。

channel可分為三種類型:

  • 只讀channel:只能讀channel里面數(shù)據(jù),不可寫入
  • 只寫channel:只能寫數(shù)據(jù),不可讀
  • 一般channel:可讀可寫

2、channel的數(shù)據(jù)結(jié)構(gòu)

type hchan struct {
    qcount uint // 隊(duì)列中元素個(gè)數(shù) 
    dataqsiz uint // 循環(huán)隊(duì)列的大小 
    buf unsafe.Pointer // 指向循環(huán)隊(duì)列 
    elemsize uint16 // 通道里面的元素大小 
    closed uint32 // 通道關(guān)閉的標(biāo)志 
    elemtype *_type // 通道元素的類型 
    sendx uint // 待發(fā)送的索引,即循環(huán)隊(duì)列中的隊(duì)尾指針front 
    recvx uint // 待讀取的索引,即循環(huán)隊(duì)列中的隊(duì)頭指針rear 
    recvq waitq // 接收等待隊(duì)列 
    sendq waitq // 發(fā)送等待隊(duì)列 
    lock mutex // 互斥鎖 
}

3、channel的hchan結(jié)構(gòu)圖

hchan結(jié)構(gòu)體中的buf指向一個(gè)數(shù)組,用來實(shí)現(xiàn)循環(huán)隊(duì)列,sendx是循環(huán)隊(duì)列的隊(duì)尾指針,recvx是循環(huán)隊(duì)列的隊(duì)頭指針。dataqsize是緩存型通道的大小,qcount是記錄通道內(nèi)元素個(gè)數(shù)。

循環(huán)隊(duì)列一般使用空余單元法來解決隊(duì)空和隊(duì)滿時(shí)候都存在font=rear帶來的二義性問題,但這樣會(huì)浪費(fèi)一個(gè)單元。golang的channel中是通過增加qcount字段記錄隊(duì)列長度來解決二義性,一方面不會(huì)浪費(fèi)一個(gè)存儲(chǔ)單元,另一方面當(dāng)使用len函數(shù)查看隊(duì)列長度時(shí)候,可以直接返回qcount字段,一舉兩得。 

hchan結(jié)構(gòu)體中另一重要部分是recvq,sendq,分別存儲(chǔ)了等待從通道中接收數(shù)據(jù)的goroutine,和等待發(fā)送數(shù)據(jù)到通道的goroutine。兩者都是waitq類型。sudog是對goroutine的一種封裝

type waitq struct {
    first *sudog
    last *sudog
}

waitq是一個(gè)結(jié)構(gòu)體類型,waitq和sudog構(gòu)成雙向鏈表,其中sudog是鏈表元素的類型,waitq中first和last字段分別指向鏈表頭部的sudog,鏈表尾部的sudog。

channel 的發(fā)送和接收操作本質(zhì)上都是 “值的拷貝”,無論是從 sender goroutine 的棧到 chan buf,還是從 chan buf 到 receiver goroutine,或者是直接從 sender goroutine 到 receiver goroutine。

channel讀取寫入流程

操作nil channelclosed channelnot nil,not closed

close

panic

panic

正常關(guān)閉

讀<-ch

阻塞

如果channel關(guān)閉前有數(shù)據(jù),則會(huì)正常讀取到數(shù)據(jù).如果沒有數(shù)據(jù)則會(huì)讀取到對應(yīng)元素類型的空值

阻塞或正常讀取數(shù)據(jù),緩沖型channel為空或非緩沖型channel等待發(fā)送者時(shí)會(huì)阻塞

寫ch<-

阻塞

panic

阻塞或正常寫入數(shù)據(jù),非緩沖型channel等待接收者或緩沖型channel buf滿時(shí)會(huì)被阻塞

到此這篇關(guān)于詳解Golang中channel的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang channel實(shí)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go中使用gjson來操作JSON數(shù)據(jù)的實(shí)現(xiàn)

    Go中使用gjson來操作JSON數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Go中使用gjson來操作JSON數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換

    golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換

    這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換的相關(guān)資料,在Go語言中string轉(zhuǎn)int是一項(xiàng)常見的操作,需要的朋友可以參考下
    2023-07-07
  • Go中變量命名規(guī)則與實(shí)例

    Go中變量命名規(guī)則與實(shí)例

    命名規(guī)則涉及變量、常量、全局函數(shù)、結(jié)構(gòu)、接口、方法等的命名,下面這篇文章主要給大家介紹了關(guān)于Go中變量命名的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 詳解Go語言中for循環(huán),break和continue的使用

    詳解Go語言中for循環(huán),break和continue的使用

    這篇文章主要通過一些示例為大家介紹一下Go語言中for循環(huán)、break和continue的基本語法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • go slice不同初始化方式性能及數(shù)組比較詳解

    go slice不同初始化方式性能及數(shù)組比較詳解

    這篇文章主要為大家介紹了go slice不同初始化方式性能及數(shù)組比較示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • go protobuf?詳解

    go protobuf?詳解

    Protobuf是Protocol Buffers的簡稱,它是Google公司開發(fā)的一種數(shù)據(jù)描述語言,是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化,這篇文章主要介紹了protobuf?詳解,需要的朋友可以參考下
    2024-01-01
  • Golang?template?包基本原理分析

    Golang?template?包基本原理分析

    這篇文章主要為大家介紹了Golang?template?包基本原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go語言每天必學(xué)之switch語句

    Go語言每天必學(xué)之switch語句

    這篇文章主要為大家詳細(xì)介紹了Go語言每天必學(xué)之switch語句的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • goland配置自動(dòng)注釋的實(shí)現(xiàn)

    goland配置自動(dòng)注釋的實(shí)現(xiàn)

    本文主要介紹了goland配置自動(dòng)注釋的實(shí)現(xiàn),文中通過圖文示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • golang os.Eixt使用示例

    golang os.Eixt使用示例

    在Go語言中,os.Exit函數(shù)用于立即終止程序并返回一個(gè)指定的退出狀態(tài)碼,本文就來介紹一下golang os.Eixt使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10

最新評論

库尔勒市| 雷山县| 东乌珠穆沁旗| 丘北县| 广宁县| 麻栗坡县| 定西市| 紫云| 金川县| 崇文区| 察隅县| 泰兴市| 云龙县| 维西| 古蔺县| 莲花县| 怀化市| 手机| 南澳县| 惠州市| 隆尧县| 雷波县| 泗阳县| 大同县| 潍坊市| 德安县| 钦州市| 廉江市| 庆云县| 榆林市| 姚安县| 蒲城县| 奉节县| 鹤峰县| 巴彦淖尔市| 尚义县| 府谷县| 武安市| 凤台县| 江都市| 潢川县|