欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1、channel的基本概念

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

channel可分為三種類型:

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

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

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

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

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

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

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

type waitq struct {
    first *sudog
    last *sudog
}

waitq是一個結(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ù),則會正常讀取到數(shù)據(jù).如果沒有數(shù)據(jù)則會讀取到對應(yīng)元素類型的空值

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

寫ch<-

阻塞

panic

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

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

相關(guān)文章

  • Go+Lua解決Redis秒殺中庫存與超賣問題

    Go+Lua解決Redis秒殺中庫存與超賣問題

    本文主要介紹了Go+Lua解決Redis秒殺中庫存與超賣問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-03-03
  • 詳解Golang開啟http服務(wù)的三種方式

    詳解Golang開啟http服務(wù)的三種方式

    這篇文章主要介紹了詳解Golang開啟http服務(wù)的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-06-06
  • golang?gorm實現(xiàn)get請求查詢案例測試

    golang?gorm實現(xiàn)get請求查詢案例測試

    這篇文章主要為大家介紹了golang?gorm實現(xiàn)get請求查詢案例測試,
    2022-04-04
  • go 代碼格式化和風格開發(fā)者指南

    go 代碼格式化和風格開發(fā)者指南

    這篇文章主要為大家介紹了go 代碼格式化和風格開發(fā)者指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 淺談用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法

    淺談用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法

    這篇文章主要介紹了用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-09-09
  • Go語言常見設(shè)計模式之裝飾模式詳解

    Go語言常見設(shè)計模式之裝飾模式詳解

    在?Go?語言中,雖然裝飾模式?jīng)]有像?Python?中應(yīng)用那么廣泛,但也有其用武之地,這篇文章我們就來一起看下裝飾模式在?Go?語言中的應(yīng)用吧
    2023-07-07
  • Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    這篇文章主要介紹了Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法,實例分析了ToLower和ToUpper函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言如何通過通信共享內(nèi)存

    Go語言如何通過通信共享內(nèi)存

    這篇文章主要為大家介紹了Go語言如何通過通信共享內(nèi)存實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • go語言interface接口繼承多態(tài)示例及定義解析

    go語言interface接口繼承多態(tài)示例及定義解析

    這篇文章主要為大家介紹了go語言interface接口繼承多態(tài)示例及定義解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    go?mod是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下
    2022-10-10

最新評論