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

淺談golang通道類型

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

一、什么是通道類型

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

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

二、通道產(chǎn)生的原因

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

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

三、聲明channel

語法:

var 變量 chan 元素類型  

例:

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

四、創(chuàng)建channel

語法:

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

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

例:

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

五、channel相關(guān)操作

1、發(fā)送值

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

例:

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

2、接收值

從一個(gè)通道中接收值。

例:

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

3、關(guān)閉通道

例:

close(ch)   

3.1 注意

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

3.2 特點(diǎn)

  • 對(duì)一個(gè)關(guān)閉的通道再發(fā)送值就會(huì)導(dǎo)致panic。
  • 對(duì)一個(gè)關(guān)閉的通道進(jìn)行接收會(huì)一直獲取值直到通道為空。
  • 對(duì)一個(gè)關(guān)閉的并且沒有值的通道執(zhí)行接收操作會(huì)得到對(duì)應(yīng)類型的零值。
  • 關(guān)閉一個(gè)已經(jīng)關(guān)閉的通道會(huì)導(dǎo)致panic。

六、通道類型

1、無緩沖通道

無緩沖的通道只有在有人接收值的時(shí)候才能發(fā)送值。就像你住的小區(qū)沒有快遞柜和代收點(diǎn),快遞員給你打電話必須要把這個(gè)物品送到你的手中,簡單來說就是無緩沖的通道必須有接收才能發(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ā)送操作會(huì)阻塞,直到另一個(gè)goroutine在該通道上執(zhí)行接收操作,這時(shí)值才能發(fā)送成功,兩個(gè)goroutine將繼續(xù)執(zhí)行。相反,如果接收操作先執(zhí)行,接收方的goroutine將阻塞,直到另一個(gè)goroutine在該通道上發(fā)送一個(gè)值。

2、有緩沖通道

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

語法:

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

例:

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

七、單向通道

有的時(shí)候我們會(huì)將通道作為參數(shù)在多個(gè)任務(wù)函數(shù)間傳遞,很多時(shí)候我們?cè)诓煌娜蝿?wù)函數(shù)中使用通道都會(huì)對(duì)其進(jìn)行限制,比如限制通道在函數(shù)中只能發(fā)送或只能接收。

語法:

chan<- int  是一個(gè)只能發(fā)送的通道,可以發(fā)送但是不能接收;
<-chan int  是一個(gè)只能接收的通道,可以接收但是不能發(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)
}

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

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

例:

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

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

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

相關(guān)文章

  • 解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過程

    解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過程

    這篇文章主要為大家介紹了解決電腦用GoLand太卡,將VsCode定制成Go IDE步驟過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    這篇文章主要介紹了Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang中可比較的數(shù)據(jù)類型詳解

    Golang中可比較的數(shù)據(jù)類型詳解

    在日常開發(fā)中,比較操作是最常用的基本操作之一,可以用來判斷變量之間是否相等或者對(duì)應(yīng)的大小關(guān)系,本文將深入解析 Golang 中可比較的數(shù)據(jù)類型,并結(jié)合代碼示例來說明如何在不同情況下進(jìn)行比較,需要的朋友可以參考下
    2024-01-01
  • go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值)

    go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值)

    本文主要介紹了go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值),主要用于執(zhí)行shell命令,并且返回shell的標(biāo)準(zhǔn)輸出,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • GoLang實(shí)現(xiàn)Viper庫的封裝流程詳解

    GoLang實(shí)現(xiàn)Viper庫的封裝流程詳解

    Viper是一個(gè)用于Go語言應(yīng)用程序的配置管理庫,它提供了一種簡單而靈活的方式來處理應(yīng)用程序的配置,支持多種格式的配置文件,這篇文章主要介紹了GoLang封裝Viper庫的流程,感興趣的同學(xué)可以參考下文
    2023-05-05
  • golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn)

    golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn)

    本文主要介紹了golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解Golang編程中的常量與變量

    詳解Golang編程中的常量與變量

    這篇文章主要介紹了詳解Golang編程中的常量與變量,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解

    Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解

    在計(jì)算機(jī)科學(xué)中,stack(棧)是一種基本的數(shù)據(jù)結(jié)構(gòu),它是一種線性結(jié)構(gòu),具有后進(jìn)先出(Last In First Out)的特點(diǎn)。本文將通過Golang實(shí)現(xiàn)堆棧,需要的可以參考一下
    2023-04-04
  • Go語言學(xué)習(xí)之Switch語句的使用

    Go語言學(xué)習(xí)之Switch語句的使用

    這篇文章主要通過一些示例為大家介紹一下Go語言中Switch語句的基本語法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • Go語言中的值類型與引用類型的使用

    Go語言中的值類型與引用類型的使用

    Go語言中的數(shù)據(jù)類型可以分為值類型和引用類型,值類型包括基本和復(fù)合數(shù)據(jù)類型,特點(diǎn)是在傳遞時(shí)進(jìn)行復(fù)制,保證數(shù)據(jù)的安全性,引用類型如slice、map等,傳遞的是引用副本,便于大型數(shù)據(jù)操作且提高性能,理解這些概念有助于編寫更高效、安全的Go代碼
    2024-09-09

最新評(píng)論