您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關golang中的通道是什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
golang中的通道類型是一種特殊的類型, 類型名字為chan。在任何時候,同時只有一個goroutine訪問通道進行并發和獲取數據,goroutine間通過通道就可以進行通信。我們可以通過go關鍵字創建goroutine。
通道本身是同步的,通道的發送和接受數據默認是同步的,且遵循先進先出的規則以保證數據發送的順序。
通道分為雙向通道和單向通道。
雙向通道:
chan1 := make(chan int, 10)
單向通道:
#單向只寫通道,10 表示通道的容量 chan2 := make(chan <- int, 10) #單向只讀通道,10表示通道的容量 chan3 := make(<- chan int, 10)
package main import ( "time" "github.com/golang/glog" ) func read(readChan <-chan int) { for data := range readChan { glog.Info(data) } } func write(writeChan chan<- int) { for i := 0; i < 100; i++ { writeChan <- i glog.Infof("write: %s", i) } } func main() { // 雙向通道 writeReadChan := make(chan int) // 傳入雙向通道自動會轉換成一個單項通道 go write(writeReadChan) glog.Info("start to read data from channel!") // 傳入雙向通道會自動轉換成一個單項通道` go read(writeReadChan) // 關閉chan close(writeReadChan) time.Sleep(time.Second * 100) glog.Info("finishedAll!!") }
通道分無緩沖通道和緩沖通道
無緩沖通道
unbufferChan1 := make(chan int) unbufferChan2 := make(chan int, 0)
緩沖通道
bufferChan := make(chan int, 1)
無緩沖通道的特點是,發送的數據需要被讀取后,發送才會完成,它阻塞場景:
通道中無數據,但執行讀通道。
通道中無數據,向通道寫數據,但無協程讀取。
func occasion1() { noBufChan := make(chan int) <-noBufChan fmt.Println("read ") } // 場景2 func occasion2() { ch := make(chan int) ch <- 1 fmt.Println("write success no block") }
有緩存通道的特點是,有緩存時可以向通道中寫入數據后直接返回,緩存中有數據時可以從通道中讀到數據直接返回,這時有緩存通道是不會阻塞的,它阻塞場景是:
通道的緩存無數據,但執行讀通道。
通道的緩存已經占滿,向通道寫數據,但無協程讀。
// 場景1 func occasion1() { bufCh := make(chan int, 2) <-bufCh fmt.Println("read from no buffer channel success") } // 場景2 func occasion2() { ch := make(chan int, 2) ch <- 1 ch <- 2 ch <- 3 fmt.Println("write success no block") }
感謝各位的閱讀!關于“golang中的通道是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。