亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中通道channel的示例分析

發布時間:2022-02-28 09:28:40 來源:億速云 閱讀:218 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Go語言中通道channel的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    一、Go語言通道基礎概念

    1.channel產生背景

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

    2.channel工作方式

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

    二、通道使用語法

    1.通道的聲明與初始化

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

    2.將數據放入通道內

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

    代碼如下:

       // 聲明一個通道
        var a chan int
            a <- 5

    3.從通道內取出數據

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

    代碼如下:

      //聲明一個通道類型
        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

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

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

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

    // 互斥鎖對象
    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.單項輸出通道

        var b <-chan int

    2.單項輸入通道

        var b chan<- int

    示例函數:

    //單項通道一般做函數參數,作為一種規范防止通道混用
    //此函數完成的功能是將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.通道的狀態

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

    四、通道死鎖原因分析

    注意以下情況:

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

    關于“Go語言中通道channel的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    保定市| 台南市| 历史| 洱源县| 陆川县| 东明县| 武定县| 沧州市| 余姚市| 额济纳旗| 建德市| 荆门市| 郓城县| 沈阳市| 财经| 彭州市| 曲阜市| 汝州市| 伊金霍洛旗| 汤原县| 西安市| 南乐县| 张家川| 吉林省| 安龙县| 化德县| 含山县| 新龙县| 永宁县| 密云县| 抚州市| 荆州市| 乐至县| 富民县| 台中市| 泾阳县| 格尔木市| 昂仁县| 湄潭县| 岚皋县| 青海省|