AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
### 有缓冲channel 有缓冲的通道(buffered channel)是一种在被接收钱能存储一个或多个值的通道. 这种类型的通道并不强制要求goroutine之间必须同时完成发送和接收.通道会阻塞发送和接收动作的条件也会不同. 只有在通道中没有要接收的值时,接收动刀才会阻塞煤制油在通道没有课用缓冲区容纳被发送的值时,发送动作才会阻塞. 这导致有缓冲的通道和五环冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收goroutine会在同一时间 进行数据交换. 有缓冲的通道没有这种保证. ### 创建方式 ~~~ make(chan Type,capacity) ~~~ 如果给定了一个缓冲区容量,通道就是异步的.只要缓冲区有未使用空间用于发送数据,或还包含可以接收的数据, 那么其通信就会无阻塞的进行. ### 有缓冲channel特点 ~~~ ch := make(chan int, 3) //创建一个有缓冲channel //新建协程 go func() { for i := 0; i < 3; i++ { fmt.Println("子协程i = ", i) ch <- i //往channel写数据 fmt.Printf("子协程缓冲区剩余数据个数 = %d ,缓冲区容量 = %d\n", len(ch), cap(ch)) } }() time.Sleep(2 * time.Second) //延迟2秒 for i := 0; i < 3; i++ { num := <-ch fmt.Println("num = ", num) fmt.Printf("主协程缓冲区剩余数据个数 = %d ,缓冲区容量 = %d\n", len(ch), cap(ch)) } ~~~ 有缓冲channel不是说就不会阻塞了,当容量为3的时候,需要往里面写入10条数据的时候,就会阻塞了,因为channel容量已满, 无法继续写入,必须等到接收方将数据取出后才能继续写入. 将上面for循环的次数改为10可以看到效果. ~~~ 子协程i = 0 子协程缓冲区剩余数据个数 = 1 ,缓冲区容量 = 3 子协程i = 1 子协程缓冲区剩余数据个数 = 2 ,缓冲区容量 = 3 子协程i = 2 子协程缓冲区剩余数据个数 = 3 ,缓冲区容量 = 3 num = 0 主协程缓冲区剩余数据个数 = 2 ,缓冲区容量 = 3 num = 1 主协程缓冲区剩余数据个数 = 1 ,缓冲区容量 = 3 num = 2 主协程缓冲区剩余数据个数 = 0 ,缓冲区容量 = 3 ~~~