【go系列5】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")
}
相關文章
- 【go】golang中的通道Golang
- [系列] Go - chan 通道Go
- Golang通道Channel詳解Golang
- 【go】golang中鎖的用法-互斥鎖Golang
- Go 併發 -- 通道Go
- Golang 併發,有快取通道,通道同步案例演示Golang快取
- GO通道和 sync 包的分享Go
- 有關golang通道的面試筆記Golang面試筆記
- Go 通道(chanel)詳解Go
- Go 緩衝通道(bufchan)用法Go
- Golang之go module開發系列二--使用偽版本和GoCenterGolang
- 【Golang 基礎系列十】Go 語言 條件語句之ifGolang
- RMAN中的通道分配
- Channels 通道 - Go 學習記錄Go
- Golang併發程式設計有緩衝通道和無緩衝通道(channel)Golang程式設計
- Ourea Go Framework 小巧的Golang 框架FrameworkGolang框架
- 從別人的程式碼中學習golang系列--01Golang
- 從別人的程式碼中學習golang系列--03Golang
- 從別人的程式碼中學習golang系列--02Golang
- golang中go mod使用第三方包Golang
- go 併發程式設計案例三 golang 中的物件導向程式設計Golang物件
- Go 的 golang.org/x/ 系列包和標準庫包有什麼區別?Golang
- 清華尹成帶你實戰GO案例(56)Go通道的同步功能Go
- go(golang)之slice的小想法1Golang
- 【Go】Golang實現gRPC的Proxy的原理GolangRPC
- golang中http server.go中的testHookServerServe函式變數寫法問題GolangHTTPServerHook函式變數
- 《快學 Go 語言》第 12 課 —— 通道Go
- Go通道機制與應用詳解Go
- RGBA中的阿爾法通道
- golang開發:go併發的建議Golang
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- Go編譯原理系列5(抽象語法樹構建)Go編譯原理抽象語法樹
- 《快學 Go 語言》第 12 課 —— 神秘的地下通道Go
- 【Go學習】Go(Golang)知識點總結Golang
- golang中的errgroupGolang
- golang中的介面Golang
- golang 中的cronjobGolang
- golang 中的 cronjobGolang