我认为 Go 中的 channel 默认只保存 1 个值,除非指定缓冲区大小。我读到 here .但是当我运行这个时:
func main (){
for i := range numGen(6) {
log.Println("taking from channel", i)
}
}
func numGen(num int) chan int {
c := make(chan string)
go func() {
for i := 0; i < num; i++ {
log.Println("passing to channel", i)
c <- i
}
close(c)
}
return c
}
我的输出是:
2017/06/13 18:09:08 passing to channel 0
2017/06/13 18:09:08 passing to channel 1
2017/06/13 18:09:08 taking from channel 0
2017/06/13 18:09:08 taking from channel 1
2017/06/13 18:09:08 passing to channel 2
2017/06/13 18:09:08 passing to channel 3
2017/06/13 18:09:08 taking from channel 2
2017/06/13 18:09:08 taking from channel 3
2017/06/13 18:09:08 passing to channel 4
2017/06/13 18:09:08 passing to channel 5
2017/06/13 18:09:08 taking from channel 4
2017/06/13 18:09:08 taking from channel 5
这表明 channel 一次保存 2 个值。像这样指定缓冲区大小
c := make(chan int, 0)
什么都不做。有什么方法可以让它只包含 1,值,而不是 2?
最佳答案
which shows that the channel is holding 2 values at a time.
事实并非如此。代码是这样执行的:
- main goroutine block 在 channel 上读取
- 第二个 goroutine 写入 channel 并继续执行。
- 第二个 goroutine 在第二次写入尝试时阻塞,因为没有人在读取
- main goroutine 继续执行,打印读取的数字
- main goroutine 读取另一个数字,因为有人正在写入它
- main goroutine 打印读取次数并在下一次读取时阻塞
- 第二个 goroutine 在 2 步继续执行。
没有缓冲区,只有并发。
关于go - channel 缓冲区比 Go 中的预期多取一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44533029/