/**
有緩衝的通道是一種在被接收前能存儲一個或者多個值得通道
這種類型不要求goroutine之間必須同時完成發送和接收。
只有在通道中沒有要接收的值時,接收動作纔會阻塞。
只有在通道中沒有可用緩衝區容納被髮送值時,發送動作纔會阻塞。
*/
package main
import (
"fmt"
"time"
)
func main(){
//創建一個無緩衝的channel
ch:=make(chan int,4)
fmt.Printf("len(ch)=%d,cap(ch)=%d\n",len(ch),cap(ch))
//新建協程
go func(){
for i:=0;i<4;i++{
fmt.Println("one=",i)
ch<-i//放入後,滿了阻塞在此,不會繼續執行;待爲0時,再繼續執行
fmt.Printf("len(ch)=%d,cap(ch)=%d\n",len(ch),cap(ch))
}
}()
//延遲2s
time.Sleep(time.Second*2)
for j:=0;j<4;j++{
num:=<-ch
fmt.Println("recevie one=",num)
}
/**
輸出:
F:\goWorkSpace\study\05協程>go run 13_有緩存的channel.go
len(ch)=0,cap(ch)=4
one= 0
len(ch)=1,cap(ch)=4
one= 1
len(ch)=2,cap(ch)=4
one= 2
len(ch)=3,cap(ch)=4
one= 3
len(ch)=4,cap(ch)=4
recevie one= 0
recevie one= 1
recevie one= 2
recevie one= 3
*/
}