以下是“A Tour of Go”中的代码示例Range and Close:
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, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}
在底部的第五行,当省略go
关键字时,结果没有改变。这是否意味着主要的goroutine在缓冲通道中发送了值然后将它们取出?
答案 0 :(得分:2)
你可以这样想:
使用go
关键字,fibonacci
功能正在向频道添加数字,而for i := range c
循环正在快速打印每个数字 添加到频道。
如果没有go
关键字,则会调用fibonacci
函数,将所有数字添加到频道,然后返回,然后 for
循环打印出channel
的数字。
看到这个的一个好方法是进入睡眠状态(playground link):
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)
}
}