在无缓冲通道上循环的范围
Range for loop over an unBuffered Channel
我是 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) 传递给斐波那契函数时,传递的是什么值?在缓冲通道上 n == 5
,在非缓冲通道上 n == 0
和你的 for 循环
for i := 0; i < 0; i++ {
实际上,这是一种非常糟糕的处理方式。您要求通道数等于迭代次数。
我不推荐以这种方式使用通道,将通道视为能够并发操作,这不是您在这种情况下想要做的事情!
如果将数字单独传递给例程数,则无缓冲通道将按预期工作:
如果通道未缓冲,cap(c)
将为零。参见 modified program
我是 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) 传递给斐波那契函数时,传递的是什么值?在缓冲通道上 n == 5
,在非缓冲通道上 n == 0
和你的 for 循环
for i := 0; i < 0; i++ {
实际上,这是一种非常糟糕的处理方式。您要求通道数等于迭代次数。
我不推荐以这种方式使用通道,将通道视为能够并发操作,这不是您在这种情况下想要做的事情!
如果将数字单独传递给例程数,则无缓冲通道将按预期工作:
cap(c)
将为零。参见 modified program