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
	
	
	*/

}
发布了134 篇原创文章 · 获赞 104 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/h4241778/article/details/105374458
今日推荐