以下是“A Tour of Go” Range 和 Close 中的代码示例:package mainimport ( "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, 10) go fibonacci(cap(c), c) for i := range c { fmt.Println(i) }}在从底部算起的第五行,当go关键字被省略时,结果没有改变。这是否意味着主 goroutine 在缓冲通道中发送值,然后将它们取出?
1 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
你可以这样想:
使用go关键字,该fibonacci函数将数字添加到通道中,并且一旦将for i := range c每个数字添加到通道中,循环就会将其打印出来。
如果没有go关键字,该fibonacci函数被调用时,添加了所有的号码的通道,然后返回,并随后将for循环输出数字关闭channel。
看到这一点的一种好方法是进入睡眠状态(操场链接):
package main
import (
"fmt"
"time"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
time.Sleep(time.Second) // ADDED THIS SLEEP
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c) // TOGGLE BETWEEN THIS
// fibonacci(cap(c), c) // AND THIS
for i := range c {
fmt.Println(i)
}
}
- 1 回答
- 0 关注
- 180 浏览
添加回答
举报
0/150
提交
取消