1、无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道,
2、这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成和发送接收操作,如果两个goroutine没有同时准备好,通道会导致先执行或者接收操作的goroutine阻塞等待。
3、这种对通道进行发送和接收的交互行为本身就是同步的,其中任意一个操作都无法离开另一个操作单独存在。
func main() {
// 创建一个无缓冲区的channel
ch := make(chan int,0)
lenNum := 4
//len(ch)缓冲区剩余数据个数,cap(ch)缓冲区大小
fmt.Printf("main len(ch) = %d, cap(ch) = %d\n", len(ch), cap(ch))
// 新建协程
go func() {
for i := 0; i < lenNum; i++ {
ch <- i //往chan写内容
fmt.Println("子协程 i=", i)
}
}()
time.Sleep(2 * time.Second)
for i := 0; i < lenNum; i++ {
num := <-ch //读管道中内容,没有内容,就会阻塞
fmt.Printf("num = %d\n", num)
}
}
运行结果如下:
4、通过上面的图可以看出,如果无缓存,子协程还没有执行完,就会阻塞去执行主协程
今天的文章无缓冲channel(管道)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31298.html