亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

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

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

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

關(guān)閉channel

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

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

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

相關(guān)文章

  • golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    這篇文章主要為大家詳細介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時因為“復制”而產(chǎn)生的開銷,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-01-01
  • Go Gin中間件的具體使用

    Go Gin中間件的具體使用

    中間件是Gin框架中的一個重要概念,它可以用來處理HTTP請求和響應,或者在處理請求之前和之后執(zhí)行一些操作,本文主要介紹了Go Gin中間件的具體使用,感興趣的可以了解一下
    2023-11-11
  • Go的gin參數(shù)校驗中的validator庫詳解

    Go的gin參數(shù)校驗中的validator庫詳解

    這篇文章主要介紹了Go的gin參數(shù)校驗之validator庫,使用 validator 以后,只需要在定義結(jié)構(gòu)體時使用 binding 或 validate tag標識相關(guān)校驗規(guī)則,就可以進行參數(shù)校驗了,而不用自己單獨去寫常見的校驗規(guī)則,需要的朋友可以參考下
    2023-08-08
  • Golang橋接模式講解和代碼示例

    Golang橋接模式講解和代碼示例

    橋接是一種結(jié)構(gòu)型設(shè)計模式,可將業(yè)務邏輯或一個大類拆分為不同的層次結(jié)構(gòu),從而能獨立地進行開發(fā),本文將通過代碼示例詳細給大家介紹一下Golang橋接模式,需要的朋友可以參考下
    2023-06-06
  • Go語言遍歷map實現(xiàn)(訪問map中的每一個鍵值對)

    Go語言遍歷map實現(xiàn)(訪問map中的每一個鍵值對)

    這篇文章主要介紹了Go語言遍歷map實現(xiàn)(訪問map中的每一個鍵值對),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • go RWMutex的實現(xiàn)示例

    go RWMutex的實現(xiàn)示例

    本文主要來介紹讀寫鎖的一種Go語言的實現(xiàn)方式RWMutex,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Golang的strings.Split()踩坑記錄

    Golang的strings.Split()踩坑記錄

    工作中,當我們需要對字符串按照某個字符串切分成字符串數(shù)組數(shù)時,常用到strings.Split(),本文主要介紹了Golang的strings.Split()踩坑記錄,感興趣的可以了解一下
    2022-05-05
  • 詳解簡單高效的Go?struct優(yōu)化

    詳解簡單高效的Go?struct優(yōu)化

    這篇文章主要為大家介紹了簡單高效的Go?struct優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Go1.18新特性工作區(qū)模糊測試及泛型的使用詳解

    Go1.18新特性工作區(qū)模糊測試及泛型的使用詳解

    這篇文章主要為大家介紹了Go?1.18新特性中的工作區(qū)?模糊測試?泛型使用進行詳細講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go 語言中 20 個占位符的整理

    Go 語言中 20 個占位符的整理

    這篇文章主要介紹了Go 語言中 20 個占位符的整理,看完本篇文章講學會什么是占位符?哪些函數(shù)支持?如何使用占位符?不同的占位符的作用?配合占位符的幾個標記符號用法?
    2021-10-10

最新評論