这是“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 在缓冲 channel 中发送值然后将它们取出?
最佳答案
你可以这样想:
使用 go
关键字,fibonacci
函数将数字添加到 channel 中,for i := range c
循环打印每个添加到 channel 后尽快编号。
没有go
关键字,调用fibonacci
函数,将所有数加到 channel 中,然后返回,then 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)
}
}
关于go - Go 中的 "go"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32794466/