共計 1623 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章給大家分享的是有關 golang 中的通道是什么的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
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 中的通道是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
正文完