课程
/后端开发
/Go
/Go语言第一课
为何非缓冲通道是先打印receive,后打印sent,而缓冲通道相反啊?
2018-10-21
源自:Go语言第一课 5-6
正在回答
首先,缓冲通道是不行的,send肯定先于receive。
非缓冲通道,多刷几次即可,偶尔就会出现一次正确结果的哦~(亲测,不是每次都相同次序的)
如果填的是0,代表`myChannel`是一个非缓存通道。发送方在向通道值发送数据的时候会立即被阻塞,直到有某一个接收方已从该通道值中接收了这条数据。
所以在第一个匿名函数执行到`sender <- number`语句之后,便被阻塞了,这时第二个匿名函数开始被执行。等到语句`fmt.Println("Received!", <-receiver)`被执行之后,通道内的值被清空了,`sender <- number`之后的语句继续被执行。所以就会看到
Received! 6 Sent!
这根python中的协程coroutine是类似的
发送方在向通道值发送数据的时候会立即被阻塞,直到有某一个接收方已从该通道值中接收了这条数据
举报
Go语言入门教程,编程之必备知识扩散,打好Go语言编程基础
1 回答有一个缓存位置的通道,在被接收数据之前也是阻塞的吗?
2 回答答案正确,但是打印不出来
1 回答appendSn函数返回值打印结果
1 回答初始化的时候是否可以定义为单向通道
2 回答go小白 问问大神 几个通道的问题