以下是“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在缓冲通道中发送了值然后将它们取出?
最佳答案 你可以这样想:
使用go关键字,fibonacci函数正在向通道添加数字,并且for i:= range c循环在将每个数字添加到通道后立即打印出来.
如果没有go关键字,则调用fibonacci函数,将所有数字添加到通道,然后返回,然后for循环打印通道上的数字.
看到这个的一个好方法就是睡觉(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)
}
}