在Tour of Go中,给出了示例代码:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
它执行得很好并且打印出来了
1
2
此行为与本练习的描述不同,其中指出:
仅当缓冲区已满时才发送到缓冲通道块。当缓冲区为空时接收块
在
ch <- 2
行之后,ch
已满,并且由于我们只运行1个单独的goroutine,即主goroutine,因此该goroutine应该被阻塞,直到ch
被接收者消耗,因此代码不应该到达fmt.Println(<-ch)
线,但应该说类似
致命错误:所有 goroutine 都在休眠 - 死锁!
然而,事实并非如此,我很困惑,并寻求指导。
通道可容纳两人。两次发送可以成功而不会阻塞。 第三一个不能。仅当通道在发送之前已满时,发送才会阻塞。
ch
是一个容量为2的通道。它最多可以容纳2个值,当你尝试放入第3个值时,它会阻塞。该示例仅输入 2 个值。