在非缓冲通道上进行循环的范围。

问题描述 投票:0回答:2

我是新来的golang,要过一遍 得到了我们. 我有下面的代码,它完美地工作,因为它应该。

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)
    }
}

但是当我使用一个非缓冲通道而不是缓冲通道时,我没有得到任何输出,为什么呢?

go channel goroutine
2个回答
2
投票

当你把cap(c)传递给fibonacci函数时,传递的是什么值? 在缓冲通道上的 n == 5无缓冲通道上的 n == 0

和你的for循环

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

其实,这是一个非常糟糕的处理方式。你是要求通道的数量等于迭代的数量。

用这样的方式使用通道我不建议,把通道看成是可以并发操作的,这不是你在这种情况下想要做的事情!

如果你把数字与例程数分开传入,那么未缓冲的通道就会按预期工作。

https:/play.golang.orgpG1b2vjTUCsV


1
投票

cap(c) 如果通道是无缓冲的,则为零。参见 修正程序

© www.soinside.com 2019 - 2024. All rights reserved.