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

Go通道channel通過(guò)通信共享內(nèi)存

 更新時(shí)間:2022年07月05日 17:25:29   作者:LiberHome  
這篇文章主要為大家介紹了Go通道channel通過(guò)通信共享內(nèi)存示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

不要通過(guò)共享內(nèi)存來(lái)通信 應(yīng)該通過(guò)通信來(lái)共享內(nèi)存

這句話有網(wǎng)友的解釋如下:

這句俏皮話具體說(shuō)來(lái)就是,不同的線程不共享內(nèi)存不用鎖,線程之間通訊用通道(channel)同步也用channel。

chanel是協(xié)程之間傳遞信息的媒介,優(yōu)雅地解決了某些后端開(kāi)發(fā)常用語(yǔ)言中隨處可見(jiàn)的lock,unlock,臨界區(qū)等,把從很多線程層面解決的問(wèn)題移到協(xié)程,從而靜態(tài)地保證沒(méi)有數(shù)據(jù)競(jìng)爭(zhēng)。

通道的聲明與創(chuàng)建

偽代碼如下:

//聲明類(lèi)型
var 通道名 chan 數(shù)據(jù)類(lèi)型
//創(chuàng)建通道
通道名 = make(chan 數(shù)據(jù)類(lèi)型)

實(shí)際例子如下:

package main
import "fmt"
func main() {
    var a chan int
    fmt.Printf("%T, %v\n", a, a)
    if a == nil {
        a = make(chan int)
        fmt.Printf("%T, %v\n", a, a)
    }
}

運(yùn)行結(jié)果是:

chan int, <nil>
chan int, 0x1400001a360

通道是一個(gè)內(nèi)存地址,這也說(shuō)明了其實(shí)一個(gè)引用類(lèi)型的數(shù)據(jù)。

接收 & 發(fā)送數(shù)據(jù)

對(duì)于同一個(gè)通道來(lái)講,他的讀數(shù)據(jù) 和 寫(xiě)數(shù)據(jù) 都是阻塞的。
偽代碼如下:

//從通道讀數(shù)據(jù)
data := <-a
//把數(shù)據(jù)寫(xiě)入通道
a <- data

實(shí)際例子如下:

package main
import "fmt"
func main() {
    //    首先創(chuàng)建一個(gè)bool類(lèi)型的通道
    var ch1 chan bool
    ch1 = make(chan bool)
    //下面啟動(dòng)一個(gè)go routine
    go func() {
        for i := 0; i &lt; 10; i++ {
            fmt.Println("子goroutine中, i: ", i)
        }
        fmt.Println("completed")
        //循環(huán)結(jié)束后 向團(tuán)隊(duì)中寫(xiě)數(shù)據(jù),表示要結(jié)束了
        ch1 &lt;- true
    }()
    //在主程序中讀取數(shù)據(jù)
    data := &lt;-ch1
    //打印一下 我們讀到的數(shù)據(jù)
    fmt.Println("main  data: ", data)
    fmt.Println("main goroutine completed")
}

運(yùn)行結(jié)果如下:

子goroutine中, i: 0
子goroutine中, i: 1
子goroutine中, i: 2
子goroutine中, i: 3
子goroutine中, i: 4
子goroutine中, i: 5
子goroutine中, i: 6
子goroutine中, i: 7
子goroutine中, i: 8
子goroutine中, i: 9
completed
main data: true
main goroutine completed

我們的子goroutine里面 循環(huán)打印1~10, 打印完成之后 把chanel類(lèi)型的ch1寫(xiě)為true,
這時(shí)候,主goroutine就可以根據(jù)這一條件進(jìn)行下一步了,,在此之前,其實(shí)就算主goroutine先搶到了資源,從ch1中讀取數(shù)據(jù),但是現(xiàn)在通道里面啥都沒(méi)有,只能阻塞,然后乖乖交出資源給我們的子goroutine,直到循環(huán)結(jié)束寫(xiě)true入ch1。

需要注意的有以下幾點(diǎn):

  • chanel是需要指定類(lèi)型的 nil類(lèi)型的chanel不能直接使用。
  • chanel本身是同步的,同一時(shí)間只能有一條goroutine進(jìn)行操作。
  • chanel是goroutine之間傳遞數(shù)據(jù)用的,chanel數(shù)據(jù)的發(fā)送和接收必須在不同的goroutine中,如果只有一條goroutine是用不上chanel的,這種情況會(huì)發(fā)生死鎖(deadLock)。
  • 從chanel里面讀數(shù)據(jù)立馬就會(huì)被阻塞,直到有向chanel寫(xiě)數(shù)據(jù)的goroutine來(lái)。
  • 向chanel里面寫(xiě)數(shù)據(jù)立馬就會(huì)被阻塞,直到有從chanel讀數(shù)據(jù)的goroutine來(lái)。

(以上都是相對(duì)于沒(méi)有緩存的通道而言,后面講到的緩存通道在緩沖區(qū)滿的時(shí)候才阻塞,而不是立刻阻塞)

以上就是Go通道channel通過(guò)通信共享內(nèi)存的詳細(xì)內(nèi)容,更多關(guān)于Go channel通信共享內(nèi)存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go中如何使用set的方法示例

    Go中如何使用set的方法示例

    這篇文章主要介紹了Go中如何使用set的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go 類(lèi)型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解

    Go 類(lèi)型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解

    這篇文章主要介紹了Go 類(lèi)型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解,cast 是在Github上開(kāi)源的工具庫(kù),就像他的名字一樣,他為我們提供了非常便捷的類(lèi)型轉(zhuǎn)化的方法
    2022-07-07
  • golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹

    golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹

    這篇文章主要介紹了golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹,進(jìn)程是操作系統(tǒng)資源分配的基本單位,是程序運(yùn)行的實(shí)例,線程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位
    2022-06-06
  • 一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)

    一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享

    Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享

    這篇文章主要為大家分享一下Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • Go語(yǔ)言之使用pprof工具查找goroutine(協(xié)程)泄漏

    Go語(yǔ)言之使用pprof工具查找goroutine(協(xié)程)泄漏

    這篇文章主要介紹了Go語(yǔ)言之使用pprof工具查找goroutine(協(xié)程)泄漏,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 解決Goland 同一個(gè)package中函數(shù)互相調(diào)用的問(wèn)題

    解決Goland 同一個(gè)package中函數(shù)互相調(diào)用的問(wèn)題

    這篇文章主要介紹了解決Goland 同一個(gè)package中函數(shù)互相調(diào)用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    模版方法是一種行為設(shè)計(jì)模式, 它在基類(lèi)中定義了一個(gè)算法的框架, 允許子類(lèi)在不修改結(jié)構(gòu)的情況下重寫(xiě)算法的特定步驟,本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • golang中單向channel的語(yǔ)法介紹

    golang中單向channel的語(yǔ)法介紹

    通過(guò)消息來(lái)共享數(shù)據(jù)是golang的一種設(shè)計(jì)哲學(xué),channel則是這種哲理的體現(xiàn)。下面這篇文章主要給大家介紹了關(guān)于golang中單向channel語(yǔ)法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • 使用golang獲取linux上文件的訪問(wèn)/創(chuàng)建/修改時(shí)間

    使用golang獲取linux上文件的訪問(wèn)/創(chuàng)建/修改時(shí)間

    這篇文章主要介紹了使用golang獲取linux上文件的訪問(wèn)/創(chuàng)建/修改時(shí)間,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08

最新評(píng)論