最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談golang通道類型

 更新時間:2023年02月14日 11:06:36   作者:飛馬攻城師  
本文主要介紹了淺談golang通道類型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、什么是通道類型

Go 語言中的通道(channel)是一種特殊的類型。通道像一個傳送帶或者隊列,總是遵循先入先出(First In First Out)的規(guī)則,保證收發(fā)數據的順序。每一個通道都是一個具體類型的導管,也就是聲明channel的時候需要為其指定元素類型。

如果說goroutine是Go程序并發(fā)的執(zhí)行體,channel就是它們之間的連接。channel是可以讓一個goroutine發(fā)送特定值到另一個goroutine的通信機制。

二、通道產生的原因

雖然可以使用共享內存進行數據交換,但是共享內存在不同的goroutine中容易發(fā)生競態(tài)問題。為了保證數據交換的正確性,必須使用互斥量對內存進行加鎖,這種做法勢必造成性能問題。

Go語言的并發(fā)模型是CSP(Communicating Sequential Processes),提倡通過通信共享內存而不是通過共享內存而實現通信。

三、聲明channel

語法:

var 變量 chan 元素類型  

例:

var ch1 chan int   // 聲明一個傳遞整型的通道
var ch2 chan bool  // 聲明一個傳遞布爾型的通道
var ch3 chan []int // 聲明一個傳遞int切片的通道   

四、創(chuàng)建channel

語法:

make(chan 元素類型, [緩沖大小])  

注意: 聲明的通道后需要使用make函數初始化之后才能使用。channel的緩沖大小是可選的。

例:

ch4 := make(chan int, 3)
ch5 := make(chan bool)
ch6 := make(chan []int)   

五、channel相關操作

1、發(fā)送值

將一個值發(fā)送到通道中。

例:

ch <- 10 // 把10發(fā)送到ch中   

2、接收值

從一個通道中接收值。

例:

x := <- ch // 從ch中接收值并賦值給變量x
<-ch       // 從ch中接收值,忽略結果   

3、關閉通道

例:

close(ch)   

3.1 注意

只有在通知接收方goroutine所有的數據都發(fā)送完畢的時候才需要關閉通道。通道是可以被垃圾回收機制回收的,它和關閉文件是不一樣的,在結束操作之后關閉文件是必須要做的,但關閉通道不是必須的。

3.2 特點

  • 對一個關閉的通道再發(fā)送值就會導致panic。
  • 對一個關閉的通道進行接收會一直獲取值直到通道為空。
  • 對一個關閉的并且沒有值的通道執(zhí)行接收操作會得到對應類型的零值。
  • 關閉一個已經關閉的通道會導致panic。

六、通道類型

1、無緩沖通道

無緩沖的通道只有在有人接收值的時候才能發(fā)送值。就像你住的小區(qū)沒有快遞柜和代收點,快遞員給你打電話必須要把這個物品送到你的手中,簡單來說就是無緩沖的通道必須有接收才能發(fā)送。

語法:

ch := make(chan type) 

例:

func recv(c chan int) {
    ret := <-c
    fmt.Println("接收成功", ret)
}
func main() {
    ch := make(chan int)
    go recv(ch) // 啟用goroutine從通道接收值
    ch <- 10
    fmt.Println("發(fā)送成功")
}  

分析: 無緩沖通道上的發(fā)送操作會阻塞,直到另一個goroutine在該通道上執(zhí)行接收操作,這時值才能發(fā)送成功,兩個goroutine將繼續(xù)執(zhí)行。相反,如果接收操作先執(zhí)行,接收方的goroutine將阻塞,直到另一個goroutine在該通道上發(fā)送一個值。

2、有緩沖通道

只要通道的容量大于零,那么該通道就是有緩沖的通道,通道的容量表示通道中能存放元素的數量。就像你小區(qū)的快遞柜只有那么個多格子,格子滿了就裝不下了,就阻塞了,等到別人取走一個快遞員就能往里面放一個。

語法:

ch := make(chan type, [cap]) 

例:

func main() {
    ch := make(chan int, 1) // 創(chuàng)建一個容量為1的有緩沖區(qū)通道
    ch <- 10
    fmt.Println("發(fā)送成功")
}   

七、單向通道

有的時候我們會將通道作為參數在多個任務函數間傳遞,很多時候我們在不同的任務函數中使用通道都會對其進行限制,比如限制通道在函數中只能發(fā)送或只能接收。

語法:

chan<- int  是一個只能發(fā)送的通道,可以發(fā)送但是不能接收;
<-chan int  是一個只能接收的通道,可以接收但是不能發(fā)送。

例:

func counter(out chan<- int) {
? ? for i := 0; i < 100; i++ {
? ? ? ? out <- i
? ? }
? ? close(out)
}

func squarer(out chan<- int, in <-chan int) {
? ? for i := range in {
? ? ? ? out <- i * i
? ? }
? ? close(out)
}
func printer(in <-chan int) {
? ? for i := range in {
? ? ? ? fmt.Println(i)
? ? }
}

func main() {
? ? ch1 := make(chan int)
? ? ch2 := make(chan int)
? ? go counter(ch1)
? ? go squarer(ch2, ch1)
? ? printer(ch2)
}

注意: 在函數傳參及任何賦值操作中將雙向通道轉換為單向通道是可以的,但反過來是不可以的。

八、從通道循環(huán)取值

例:

// channel 練習
func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)
    // 開啟goroutine將0~100的數發(fā)送到ch1中
    go func() {
        for i := 0; i < 100; i++ {
            ch1 <- i
        }
        close(ch1)
    }()
    // 開啟goroutine從ch1中接收值,并將該值的平方發(fā)送到ch2中
    go func() {
        for {
            i, ok := <-ch1 // 通道關閉后再取值ok=false
            if !ok {
                break
            }
            ch2 <- i * i
        }
        close(ch2)
    }()
    // 在主goroutine中從ch2中接收值打印
    for i := range ch2 { // 通道關閉后會退出for range循環(huán)
        fmt.Println(i)
    }
}   

分析: 有兩種方式在接收值的時候判斷通道是否被關閉,我們通常使用的是for range的方式。

到此這篇關于淺談golang通道類型的文章就介紹到這了,更多相關golang 通道類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言內建函數cap的實現示例

    Go語言內建函數cap的實現示例

    cap 是一個常用的內建函數,它用于獲取某些數據結構的容量,本文主要介紹了Go語言內建函數cap的實現示例,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Go?實現?Nginx?加權輪詢算法的方法步驟

    Go?實現?Nginx?加權輪詢算法的方法步驟

    本文主要介紹了Go?實現?Nginx?加權輪詢算法的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 淺析Golang中閉包的創(chuàng)建與使用

    淺析Golang中閉包的創(chuàng)建與使用

    閉包是包括?Go?在內的編程語言的一項強大功能,通過閉包,您可以在函數中封裝數據,并通過函數的返回值訪問這些數據,本文將介紹Go?中閉包的基礎知識,希望對大家有所幫助
    2023-11-11
  • Go并發(fā)編程之goroutine使用正確方法

    Go并發(fā)編程之goroutine使用正確方法

    并發(fā)編程有一種常見方式就是許多工作子協程都是獨立的,互不干擾,但他們又是“同一時間”處理。本文重大給大家介紹Go并發(fā)編程goroutine使用方法,一起看看吧
    2021-09-09
  • Go語言帶緩沖的通道的使用

    Go語言帶緩沖的通道的使用

    Go語言中有緩沖的通道是一種在被接收前能存儲一個或者多個值的通道,本文就來介紹一下Go語言帶緩沖的通道的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Go并發(fā)調用的超時處理的方法

    Go并發(fā)調用的超時處理的方法

    這篇文章主要介紹了Go并發(fā)調用的超時處理的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • golang使用go mod導入本地包和第三方包的方式

    golang使用go mod導入本地包和第三方包的方式

    這篇文章主要介紹了golang使用go mod導入本地包和第三方包的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Golang觀察者模式優(yōu)化訂單處理系統(tǒng)實例探究

    Golang觀察者模式優(yōu)化訂單處理系統(tǒng)實例探究

    當涉及到訂單處理系統(tǒng)時,觀察者設計模式可以用于實現訂單狀態(tài)的變化和通知,在這篇文章中,我們將介紹如何使用Golang來實現觀察者設計模式,并提供一個基于訂單處理系統(tǒng)的代碼示例
    2024-01-01
  • 使用Go語言生成二維碼并在命令行中輸出

    使用Go語言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標準,廣泛應用于商業(yè)、移動支付和數據存儲等領域,在開發(fā)過程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11
  • 一文帶你搞明白Go中的面向對象

    一文帶你搞明白Go中的面向對象

    這篇文章主要為大家詳細介紹了Go語言中面向對象的相關知識,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以參考一下
    2023-07-07

最新評論

剑阁县| 屏东市| 潞城市| 丰顺县| 灵寿县| 若尔盖县| 吴旗县| 都兰县| 兰西县| 利辛县| 同江市| 米林县| 甘洛县| 揭西县| 垫江县| 邻水| 东源县| 泗水县| 黄陵县| 方城县| 中西区| 明水县| 建阳市| 旌德县| 板桥市| 平南县| 青河县| 宁远县| 攀枝花市| 惠安县| 福州市| 鞍山市| 渭南市| 蒙山县| 井研县| 汶上县| 黑龙江省| 栾川县| 南京市| 海原县| 高陵县|