一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

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

Go語言中的通道channel詳情

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

這篇文章主要介紹了Go語言中的通道channel,在Go語言中管道類似于一個數據流,每次放入或者取出一部分數據,數據取出后原通道內的數據就刪除掉,在linux操作系統中管道會將函數的返回結果作為下一個函數的參數,下文詳細內容需要的

一、Go語言通道基礎概念

1.channel產生背景

    線程之間進行通信的時候,會因為資源的爭奪而產生竟態問題,為了保證數據交換的正確性,必須使用互斥量給內存進行加鎖,go語言并發的模型是CSP,提倡通過通信共享內存,而不是通過共享內存而實現通信,通道恰巧滿足這種需求。

2.channel工作方式

    channel類似與一個隊列,滿足先進先出的規則,嚴格保證收發數據的順序,每一個通道只能通 過固定類型的數據如果通道進行大型結構體、字符串的傳輸,可以將對應的指針傳進去,盡量的節省空間

二、通道使用語法

1.通道的聲明與初始化

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

2.將數據放入通道內

  • 取出數據使用操作符 <-操作符右是輸入變量,操作符左是通道代表數據流入通道內

代碼如下:

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

3.從通道內取出數據

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

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
 //聲明一個通道類型
    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("接收到了數據:", x)
        }
    }(a)

4.關閉通道close

    如果通道重復關閉或者關閉一個沒有初始化的通道就會拋出錯誤

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

在并發函數中一次關閉通道代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 互斥鎖對象
var once sync.Once
//并發函數
//這個函數的目的是將a通道內數據乘以10發送到通道b內
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通道只關閉一次
    once.Do(func() {
        close(b)
    })
}

三、單項通道及通道的狀態分析

1.單項輸出通道

?
1
    var b <-chan int

2.單項輸入通道

?
1
    var b chan<- int

示例函數:

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

3.通道的狀態

channel nil未初始化 空通道 滿通道 非空
接收 阻塞 阻塞 接收值 接收值
發送 阻塞 發送值 阻塞 發送值
關閉 panic 關閉成功 關閉成功 關閉成功
關閉后返回的數據 panic 返回0值 數據讀完后返回零值 數據讀完返回零值

四、通道死鎖原因分析

注意以下情況:

在使用通道的時候,從以上表格可知有時會進入阻塞狀態,結合waitGroup,如果在主函數等待使用通道的函數執行結束,而使用通道的函數并且通道陷入阻塞狀態,如果有其他函數對其進行喚醒則不會死鎖,如果沒有其他函數可以對其進行喚醒則會拋出死鎖異常。

總結:
通道將數據隔離在每一份通道內,在并發的情況下可以很好的使用數據,當然要熟悉通道阻塞的幾種情況,避免死鎖異常。

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

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

延伸 · 閱讀

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

    golang json.Marshal 特殊html字符被轉義的解決方法

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

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

    golang如何使用struct的tag屬性的詳細介紹

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

    Go語言中文網11352020-05-21
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

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

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

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

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

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

    go語言制作端口掃描器

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

    腳本之家3642020-04-25
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

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

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

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

    天易獨尊11682021-06-09
主站蜘蛛池模板: 性鸥美| 99精品国产成人一区二区在线 | 高清一区高清二区视频 | 52av我爱avhaose01| 4444亚洲国产成人精品 | 亚洲日本va中文字幕 | 数学老师扒开腿让我爽快 | 国产一卡2卡3卡四卡高清 | 欧美三级小视频 | 国产成人小视频在线观看 | 成3d漫二区三区四区 | 日本韩国一区二区三区 | 黑人好大好硬好深好爽想要h | 国产成人一区二区三区视频免费蜜 | 亚洲 欧美 在线观看 | 亚洲欧美综合一区 | 国产精品久久久久久影视 | 久久精品123 | 国产欧美日韩专区毛茸茸 | 久青草国产在线观看视频 | 国产亚洲女在线精品 | 日韩精品视频美在线精品视频 | 韩国日本香港毛片免费 | 精新精新国产自在现拍 | 97导航| 亚洲欧美一 | 精品视频手机在线观看免费 | 欧美日韩一区二区综合 | 亚洲视频免 | 欧美日韩国产一区二区三区在线观看 | 亚洲丰满模特裸做爰 | 大ji吧快给我别停受不了视频 | 亚洲欧美视频在线播放 | 亚洲一级片在线播放 | re99热| 欧美骚熟 | 成人国产在线视频 | 免费国产成人 | 国产高清在线精品一区 | 午夜在线观看免费完整直播网 | 日韩欧美高清视频 |