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

Go?channel結(jié)構(gòu)體源碼和讀寫(xiě)和關(guān)閉過(guò)程詳解

 更新時(shí)間:2023年05月04日 16:02:56   作者:CCSU__LRF  
這篇文章主要介紹了Go?channel結(jié)構(gòu)體源碼和讀寫(xiě)和關(guān)閉過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
  • 簡(jiǎn)而言之,channel維護(hù)了一個(gè)帶指針的接受和發(fā)送的隊(duì)列,其中包含mutex鎖保證并發(fā)安全,數(shù)據(jù)類(lèi)型,元素個(gè)數(shù),元素大小,channel狀態(tài)
  • 然后讀寫(xiě)操作,先看隊(duì)列是否可以取出,然后看緩沖區(qū),最后放入接受/發(fā)送隊(duì)列
  • 關(guān)閉就是喚醒所有g(shù)oroutine然后將他們的標(biāo)志位設(shè)為1,表示關(guān)閉,以后有人訪(fǎng)問(wèn)就是nil

結(jié)構(gòu)體源碼

type hchan struct {
    qcount   uint           // 當(dāng)前隊(duì)列中元素的數(shù)量
    dataqsiz uint           // 緩沖區(qū)大小,即可以緩存的元素?cái)?shù)量
    buf      unsafe.Pointer // 指向隊(duì)列的緩沖區(qū)
    elemsize uint16         // 每個(gè)元素的大小
    closed   uint32         // channel 是否已關(guān)閉的標(biāo)志
    elemtype *_type         // channel 中元素的類(lèi)型
    sendx    uint           // 下一次發(fā)送元素的位置
    recvx    uint           // 下一次接收元素的位置
    recvq    waitq          // 等待接收的 goroutine 隊(duì)列
    sendq    waitq          // 等待發(fā)送的 goroutine 隊(duì)列
    lock     mutex          // 用于保護(hù) channel 的互斥鎖
}

發(fā)送數(shù)據(jù)

當(dāng)一個(gè) goroutine 要向 channel 中發(fā)送數(shù)據(jù)時(shí),它會(huì)執(zhí)行 chansend 函數(shù)。

  • 這個(gè)函數(shù)首先會(huì)對(duì) channel 進(jìn)行加鎖,然后判斷是否有等待接收的 goroutine
  • 如果有,則直接將數(shù)據(jù)發(fā)送給它;否則,如果緩沖區(qū)未滿(mǎn),則將數(shù)據(jù)放入緩沖區(qū),隊(duì)列中元素?cái)?shù)量加一;
  • 如果隊(duì)列已滿(mǎn),則將當(dāng)前 goroutine 加入等待發(fā)送的 goroutine 隊(duì)列中,并阻塞它,等待其他 goroutine 接收數(shù)據(jù)。

接受數(shù)據(jù)

當(dāng)一個(gè) goroutine 要從 channel 中接收數(shù)據(jù)時(shí),它會(huì)執(zhí)行 src/runtime/chan.go 中的 chanrecv 函數(shù)。

  • 這個(gè)函數(shù)也會(huì)對(duì) channel 進(jìn)行加鎖,然后判斷是否有等待發(fā)送的 goroutine,如果有,則直接從它那里接收數(shù)據(jù);
  • 否則,如果緩沖區(qū)元素的數(shù)量大于 0,則從緩沖區(qū)中取出一個(gè)元素,并將隊(duì)列中元素?cái)?shù)量減一。
  • 如果緩沖區(qū)為空,則將當(dāng)前 goroutine 加入等待接收的 goroutine 隊(duì)列中,并阻塞它,等待其他 goroutine 發(fā)送數(shù)據(jù)。

關(guān)閉channel

當(dāng)一個(gè) goroutine 要關(guān)閉 channel 時(shí),它會(huì)執(zhí)行 src/runtime/chan.go 中的 closechan 函數(shù)。

  • 這個(gè)函數(shù)會(huì)對(duì) channel 進(jìn)行加鎖,然后將 closed 標(biāo)志置為 1,表示 channel 已經(jīng)關(guān)閉。
  • 然后遍歷等待發(fā)送和等待接收的 goroutine 隊(duì)列,將它們?nèi)繂拘?,并返回一個(gè)特殊的值來(lái)表示 channel 已經(jīng)關(guān)閉。

到此這篇關(guān)于Go channel結(jié)構(gòu)體源碼和讀寫(xiě)和關(guān)閉過(guò)程的文章就介紹到這了,更多相關(guān)go channel結(jié)構(gòu)體源碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單聊天系統(tǒng)

    使用Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單聊天系統(tǒng)

    本文介紹了如何使用Go語(yǔ)言和WebSocket技術(shù)構(gòu)建一個(gè)簡(jiǎn)單的多人聊天室系統(tǒng),包括客戶(hù)端連接管理、消息廣播和并發(fā)處理,最后,通過(guò)編寫(xiě)main.go、hub.go和client.go等核心代碼模塊,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • 一文帶你吃透Golang中的類(lèi)型轉(zhuǎn)換

    一文帶你吃透Golang中的類(lèi)型轉(zhuǎn)換

    Golang是一種強(qiáng)類(lèi)型語(yǔ)言,所以Golang的類(lèi)型轉(zhuǎn)換和C/C++ java等語(yǔ)言的類(lèi)型轉(zhuǎn)換還有點(diǎn)區(qū)別,本文講通過(guò)一些簡(jiǎn)單的示例帶大家深入了解一下Golang中的類(lèi)型轉(zhuǎn)換,需要的可以參考下
    2023-05-05
  • 解決golang內(nèi)存溢出的方法

    解決golang內(nèi)存溢出的方法

    這篇文章主要介紹了解決golang內(nèi)存溢出的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • k8s容器互聯(lián)flannel?vxlan通信原理

    k8s容器互聯(lián)flannel?vxlan通信原理

    這篇文章主要為大家介紹了k8s容器互聯(lián)flannel?vxlan通信原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go基于GORM 獲取當(dāng)前請(qǐng)求所執(zhí)行的 SQL 信息(思路詳解)

    Go基于GORM 獲取當(dāng)前請(qǐng)求所執(zhí)行的 SQL 信息(思路詳解)

    這篇文章主要介紹了Go基于GORM 獲取當(dāng)前請(qǐng)求所執(zhí)行的 SQL 信息(思路詳解),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • golang panic及處理機(jī)制

    golang panic及處理機(jī)制

    Go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種異常,因?yàn)镚o語(yǔ)言的設(shè)計(jì)者們認(rèn)為,將異常與控制結(jié)構(gòu)混在一起會(huì)很容易使得代碼變得混亂,今天給大家介紹golang panic及處理機(jī)制,需要的朋友參考下吧
    2021-08-08
  • Golang實(shí)現(xiàn)Directional Channel(定向通道)

    Golang實(shí)現(xiàn)Directional Channel(定向通道)

    這篇文章主要介紹了Golang實(shí)現(xiàn)Directional Channel(定向通道),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例

    Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例

    本文主要介紹了Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語(yǔ)言web框架Gin響應(yīng)客戶(hù)端的方式

    Go語(yǔ)言web框架Gin響應(yīng)客戶(hù)端的方式

    Gin是一個(gè)用Go語(yǔ)言編寫(xiě)的web框架,它是一個(gè)類(lèi)似于martini但擁有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍,本文給大家介紹了Go語(yǔ)言web框架Gin響應(yīng)客戶(hù)端有哪些方式,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go?1.21新增的內(nèi)置函數(shù)分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個(gè)函數(shù)的用途和使用示例,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08

最新評(píng)論

临桂县| 德清县| 囊谦县| 巴中市| 疏勒县| 长春市| 双鸭山市| 灵宝市| 项城市| 天等县| 屏东县| 景宁| 通渭县| 佛冈县| 黄浦区| 永寿县| 长沙县| 霸州市| 广东省| 大同市| 荥阳市| 夏河县| 虞城县| 海兴县| 台前县| 定结县| 锡林郭勒盟| 彝良县| 隆尧县| 利川市| 铜梁县| 米脂县| 福州市| 襄城县| 天峨县| 叶城县| 富蕴县| 三原县| 班玛县| 甘德县| 永平县|