5.13 go 有緩衝的channel

/**
有緩衝的通道是一種在被接收前能存儲一個或者多個值得通道
這種類型不要求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
	
	
	*/

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章