国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - Go語言中的通道channel詳情

Go語言中的通道channel詳情

2022-02-25 23:53酷爾。 Golang

這篇文章主要介紹了Go語言中的通道channel,在Go語言中管道類似于一個(gè)數(shù)據(jù)流,每次放入或者取出一部分?jǐn)?shù)據(jù),數(shù)據(jù)取出后原通道內(nèi)的數(shù)據(jù)就刪除掉,在linux操作系統(tǒng)中管道會(huì)將函數(shù)的返回結(jié)果作為下一個(gè)函數(shù)的參數(shù),下文詳細(xì)內(nèi)容需要的

一、Go語言通道基礎(chǔ)概念

1.channel產(chǎn)生背景

    線程之間進(jìn)行通信的時(shí)候,會(huì)因?yàn)橘Y源的爭(zhēng)奪而產(chǎn)生竟態(tài)問題,為了保證數(shù)據(jù)交換的正確性,必須使用互斥量給內(nèi)存進(jìn)行加鎖,go語言并發(fā)的模型是CSP,提倡通過通信共享內(nèi)存,而不是通過共享內(nèi)存而實(shí)現(xiàn)通信,通道恰巧滿足這種需求。

2.channel工作方式

    channel類似與一個(gè)隊(duì)列,滿足先進(jìn)先出的規(guī)則,嚴(yán)格保證收發(fā)數(shù)據(jù)的順序,每一個(gè)通道只能通 過固定類型的數(shù)據(jù)如果通道進(jìn)行大型結(jié)構(gòu)體、字符串的傳輸,可以將對(duì)應(yīng)的指針傳進(jìn)去,盡量的節(jié)省空間

二、通道使用語法

1.通道的聲明與初始化

?
1
2
3
4
5
    //定義一個(gè)通道對(duì)象使用,其中int可以換為自己需要的類型
    var a chan int  
    //初始化只有一個(gè)位置的通道(第一個(gè)參數(shù)代表通道類型,第二個(gè)參數(shù)代表通道有幾個(gè)位置)
    //位置存滿后新的數(shù)據(jù)將存不進(jìn)來(阻塞)
    a = make(chan int,1)

2.將數(shù)據(jù)放入通道內(nèi)

  • 取出數(shù)據(jù)使用操作符 <-操作符右是輸入變量,操作符左是通道代表數(shù)據(jù)流入通道內(nèi)

代碼如下:

?
1
2
3
   // 聲明一個(gè)通道
    var a chan int
        a <- 5

3.從通道內(nèi)取出數(shù)據(jù)

  •  取出數(shù)據(jù)也使用操作符 <-操作符右是通道,操作符左是接受變量

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
 //聲明一個(gè)通道類型
    var a chan int
    fmt.Println("未初始化的通道", a)
    a = make(chan int)
    // wg.Add(1)
    go func(a chan int) {
        // defer wg.Done()
        for {
            x := <-a
            fmt.Println("接收到了數(shù)據(jù):", x)
        }
    }(a)

4.關(guān)閉通道close

    如果通道重復(fù)關(guān)閉或者關(guān)閉一個(gè)沒有初始化的通道就會(huì)拋出錯(cuò)誤

?
1
 close(a)//a為待關(guān)閉的通道

在并發(fā)函數(shù)中一次關(guān)閉通道代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 互斥鎖對(duì)象
var once sync.Once
//并發(fā)函數(shù)
//這個(gè)函數(shù)的目的是將a通道內(nèi)數(shù)據(jù)乘以10發(fā)送到通道b內(nèi)
func f2(a <-chan int, b chan<- int) {
    defer wg.Done()
    for {
        x, ok := <-a
        if !ok {
            break
        }
        fmt.Println(x)
        b <- x * 10
    }
    // 確保b通道只關(guān)閉一次
    once.Do(func() {
        close(b)
    })
}

三、單項(xiàng)通道及通道的狀態(tài)分析

1.單項(xiàng)輸出通道

?
1
    var b <-chan int

2.單項(xiàng)輸入通道

?
1
    var b chan<- int

示例函數(shù):

?
1
2
3
4
5
6
7
8
9
10
11
12
//單項(xiàng)通道一般做函數(shù)參數(shù),作為一種規(guī)范防止通道混用
//此函數(shù)完成的功能是將a內(nèi)的數(shù)據(jù)乘以10放入通道b內(nèi)
func f2(a <-chan int, b chan<- int) {
    for {
        x, ok := <-a
        if !ok {
            break
        }
        fmt.Println(x)
        b <- x * 10
    }
}

3.通道的狀態(tài)

channel nil未初始化 空通道 滿通道 非空
接收 阻塞 阻塞 接收值 接收值
發(fā)送 阻塞 發(fā)送值 阻塞 發(fā)送值
關(guān)閉 panic 關(guān)閉成功 關(guān)閉成功 關(guān)閉成功
關(guān)閉后返回的數(shù)據(jù) panic 返回0值 數(shù)據(jù)讀完后返回零值 數(shù)據(jù)讀完返回零值

四、通道死鎖原因分析

注意以下情況:

在使用通道的時(shí)候,從以上表格可知有時(shí)會(huì)進(jìn)入阻塞狀態(tài),結(jié)合waitGroup,如果在主函數(shù)等待使用通道的函數(shù)執(zhí)行結(jié)束,而使用通道的函數(shù)并且通道陷入阻塞狀態(tài),如果有其他函數(shù)對(duì)其進(jìn)行喚醒則不會(huì)死鎖,如果沒有其他函數(shù)可以對(duì)其進(jìn)行喚醒則會(huì)拋出死鎖異常。

總結(jié):
通道將數(shù)據(jù)隔離在每一份通道內(nèi),在并發(fā)的情況下可以很好的使用數(shù)據(jù),當(dāng)然要熟悉通道阻塞的幾種情況,避免死鎖異常。

到此這篇關(guān)于Go語言中的通道channel詳情的文章就介紹到這了,更多相關(guān)Go語言中的通道channel內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/apple_51931783/article/details/122532742

延伸 · 閱讀

精彩推薦
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識(shí)符允許由...

    4272021-11-24
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號(hào)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧...

    天易獨(dú)尊11682021-06-09
主站蜘蛛池模板: 亚洲男人的天堂网站 | 午夜视频在线观看网站 | 国产精品99久久免费观看 | 在线日韩 | 国产中文| 国产精品美女久久久久久久网站 | 国产在线精品一区二区三区 | 国产色秀视频在线观看 | 四季久久免费一区二区三区四区 | 国产综合中文字幕 | 久久一区 | 国产麻豆乱码精品一区二区三区 | 不卡一区 | 91在线综合 | 操视频网站 | 色综合网址 | 香蕉依人 | 91色在线观看 | 日韩在线欧美 | 天堂中文视频在线观看 | 亚洲免费在线观看 | 久久国产精品免费 | 欧美 中文字幕 | 操操操干干干 | 天天躁日日躁bbbbb | 国产噜噜噜噜噜久久久久久久久 | 在线观看亚洲一区二区三区 | 国产日韩精品久久 | 精品黄色国产 | 天天干天天操 | 欧美一区二区日韩一区二区 | 91精品国产91久久综合桃花 | 99久久免费看精品国产 | 亚洲精品久久 | 亚洲成人一区 | 欧美成年黄网站色视频 | 一区二区成人网 | 欧美一级片aaa | 中文字幕国产视频 | 久久综合伊人 | 欧美国产一区二区 |