未缓冲通道上循环的范围



我是golang的新手,正在复习gotour。我有以下代码,它可以完美地工作。

package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 5)
//  c := make(chan int)     //doesn't work, why ?
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}

但是,当我使用非缓冲通道而不是缓冲通道时,我不会得到任何输出,为什么会这样?

当您将cap(c(传递给fibonacci函数时,传递的值是多少?在缓冲信道n == 5上,在非缓冲信道n == 0

和你的for loop

for i := 0; i < 0; i++ {

事实上,这是一种非常糟糕的处理方式。您要求通道的数量等于迭代次数。

我不建议以这种方式使用通道,请将通道视为能够同时操作,这不是您在这种情况下想要做的事情!

如果您将数字单独传递给例程的数量,那么无缓冲通道将按预期工作:

https://play.golang.org/p/G1b2vjTUCsV

如果通道未缓冲,则

cap(c)将为零。参见修改后的程序

最新更新