一 介紹
1 使用
無緩沖區(qū)
ch := make(chan int)
ch<-1
<-ch
有緩沖區(qū)
ch := make(chan int , 2)
2 結(jié)論
無緩沖:發(fā)送和接收動作是同時發(fā)生的忌穿。如果沒有 goroutine 讀取 channel (<- channel)刃唤,則發(fā)送者 (channel <-) 會一直阻塞。
帶緩沖:緩沖 channel 類似一個有容量的隊列坎缭。當(dāng)隊列滿的時候發(fā)送者會阻塞竟痰;當(dāng)隊列空的時候接收者會阻塞。
3 關(guān)閉
重復(fù)關(guān)閉 channel 會導(dǎo)致 panic掏呼。
向已關(guān)閉的channel發(fā)送數(shù)據(jù)會導(dǎo)致panic
從已經(jīng)關(guān)閉的channel中取數(shù)據(jù)坏快,會得到對應(yīng)channel類型的0值,如果是int則得到0
4 ok-idiom 方式
ch := make(chan int , 1)
close(ch)
val, ok := <- ch
if ok == false {
//channel was closed
}
二 應(yīng)用場景
- goroutine 間的通信
func main() {
x := make(chan int)
go func() {
x <- 1
}()
<-x
}
2.select 中使用
3.range channel
range channel 可以直接取到 channel 中的值憎夷。當(dāng)我們使用 range 來操作 channel 的時候假消,一旦 channel 關(guān)閉,channel 內(nèi)部數(shù)據(jù)讀完之后循環(huán)自動結(jié)束岭接。
- 超時控制
在很多操作情況下都需要超時控制富拗,利用 select 實現(xiàn)超時控制臼予,下面是一個簡單的示例。 - 生產(chǎn)者-消費者模型
利用緩沖 channel 可以很輕松的實現(xiàn)生產(chǎn)者-消費者模型啃沪。上面的 range 示例其實就是一個簡單的生產(chǎn)者-消費者模型實現(xiàn)粘拾。