我正在学习here中的Go语言,我像这样修改了一点代码,我在quit <- 0之前添加了一个睡眠(2s),并用i输出斐波纳契数的索引,下面是我的代码:
package main
import "fmt"
import "time"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(i,<-c) // output index for result clearly
}
time.Sleep(2000*time.Millisecond) // add sleep for result clearly
quit <- 0
}()
fibonacci(c, quit)
}我发现stdout立即输出0-8,但等待2秒它输出9,然后是"quit“。
我将这段代码移到一个go文件中并运行它。一开始,它像上面描述的那样输出0-8,但在我多次更改总数(从10到9,8或3,不管是什么)后,它立即直接输出所有斐波那契数(当然,它在2秒后输出quit )!
我在浏览器中运行代码(我使用Chrome),它仍然输出9延迟,当我将10改为3时,它立即输出0-2。
所以我搞不懂为什么它会输出第9个延迟?
更新:我想我知道为什么,因为我的输出窗口太小,不能输出整个结果,但我总是向下滚动,它仍然显示8。如果我放大输出窗口,它将立即输出0-9。那么,这是本教程的一个bug吗?
发布于 2015-05-21 15:23:21
我认为这是本教程的一个bug。如果输出窗口(左下角)太小,它将在没有的情况下显示最后一行,因此不会立即显示第9行。
如果我在fmt.Println(i,<-c)后面添加fmt.Println("foo"),它不会输出包含foo字符串的最后一行,但会显示第九个斐波那契数。
我在Chrome中捕获了响应,它可以告诉我如何显示结果,包括它将输出的时间。所以一定是页面的bug吞没了最后一行。:D
PS:回复如下:
{
"Errors":"",
"Events":[
{
"Message":"0 0\nfoo\n1 1\nfoo\n2 1\nfoo\n3 2\nfoo\n4 3\nfoo\n5 5\nfoo\n6 8\nfoo\n7 13\nfoo\n8 21\nfoo\n9 34\nfoo\n",
"Kind":"stdout",
"Delay":0
},
{
"Message":"quit\n",
"Kind":"stdout",
"Delay":2000000000
}
]
}https://stackoverflow.com/questions/30366551
复制相似问题