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

Go語言中的通道channel詳情

 更新時間:2022年02月25日 16:52:23   作者:酷爾。  
這篇文章主要介紹了Go語言中的通道channel,在Go語言中管道類似于一個數(shù)據(jù)流,每次放入或者取出一部分?jǐn)?shù)據(jù),數(shù)據(jù)取出后原通道內(nèi)的數(shù)據(jù)就刪除掉,在linux操作系統(tǒng)中管道會將函數(shù)的返回結(jié)果作為下一個函數(shù)的參數(shù),下文詳細(xì)內(nèi)容需要的朋友可以參考下

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

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

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

2.channel工作方式

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

二、通道使用語法

1.通道的聲明與初始化

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

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

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

代碼如下:

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

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

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

代碼如下:

 ?//聲明一個通道類型
?? ?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)閉一個沒有初始化的通道就會拋出錯誤

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

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

// 互斥鎖對象
var once sync.Once
//并發(fā)函數(shù)
//這個函數(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)
?? ?})
}

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

1.單項輸出通道

?? ?var b <-chan int

2.單項輸入通道

?? ?var b chan<- int

示例函數(shù):

//單項通道一般做函數(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)

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

四、通道死鎖原因分析

注意以下情況:

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

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

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

相關(guān)文章

  • golang中beego入門

    golang中beego入門

    Beego是一個基于Go語言的開源框架,用于構(gòu)建Web應(yīng)用程序和API,本文主要介紹了golang中beego入門,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Go框架自動化工具Beego使用詳解

    Go框架自動化工具Beego使用詳解

    這篇文章主要為大家介紹了Go框架自動化工具Beego使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言生成隨機數(shù)的方法

    Go語言生成隨機數(shù)的方法

    這篇文章主要介紹了Go語言生成隨機數(shù)的方法,實例分析了Go語言生成隨機數(shù)的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go實現(xiàn)各類限流的方法

    Go實現(xiàn)各類限流的方法

    這篇文章主要介紹了Go實現(xiàn)各類限流的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Go語言常見錯誤接口污染解決分析

    Go語言常見錯誤接口污染解決分析

    這篇文章主要為大家介紹了Go語言常見錯誤接口污染解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 使用Go實現(xiàn)健壯的內(nèi)存型緩存的方法

    使用Go實現(xiàn)健壯的內(nèi)存型緩存的方法

    這篇文章主要介紹了使用Go實現(xiàn)健壯的內(nèi)存型緩存,本文比較了字節(jié)緩存和結(jié)構(gòu)體緩存的優(yōu)劣勢,介紹了緩存穿透、緩存錯誤、緩存預(yù)熱、緩存?zhèn)鬏?、故障轉(zhuǎn)移、緩存淘汰等問題,并對一些常見的緩存庫進行了基準(zhǔn)測試,需要的朋友可以參考下
    2022-05-05
  • go語言實現(xiàn)將重要數(shù)據(jù)寫入圖片中

    go語言實現(xiàn)將重要數(shù)據(jù)寫入圖片中

    本文給大家分享的是go語言實現(xiàn)將數(shù)據(jù)的二進制形式寫入圖像紅色通道數(shù)據(jù)二進制的低位,從而實現(xiàn)將重要數(shù)據(jù)隱藏,有需要的小伙伴參考下吧。
    2015-03-03
  • 模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    這篇文章主要介紹了模塊一 GO語言基礎(chǔ)知識-庫源碼文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • gin正確多次讀取http?request?body內(nèi)容實現(xiàn)詳解

    gin正確多次讀取http?request?body內(nèi)容實現(xiàn)詳解

    這篇文章主要為大家介紹了gin正確多次讀取http?request?body內(nèi)容實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Golang中panic與recover的區(qū)別

    Golang中panic與recover的區(qū)別

    這篇文章主要介紹了Golang中panic與recover的區(qū)別,文章基于Golang的基礎(chǔ)內(nèi)容展開panic與recover的區(qū)別介紹,需要的小伙伴可以參考一下
    2022-06-06

最新評論