无缓冲通道上的循环范围

我是 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)

    }

}

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


猛跑小猪
浏览 97回答 2
2回答

四季花海

当您将 cap(c) 传递给斐波那契函数时,传递的是什么值?在缓冲通道上n == 5, 在无缓冲通道上n == 0和你的 for 循环for&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;<&nbsp;0;&nbsp;i++&nbsp;{实际上,这是处理这种情况的一种非常糟糕的方式。您要求通道数等于迭代次数。我不建议以这种方式使用通道,将通道视为能够并发操作,这不是您在这种情况下想要做的事情!如果您将数字单独传递给例程的数量,那么无缓冲通道将按预期工作:https://play.golang.org/p/G1b2vjTUCsV

狐的传说

cap(c)如果通道未缓冲,则为零。查看修改后的程序
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go