2015-05-21 142 views
0

我正在学习围棋索绪尔在here,我修改了一点这样的代码,我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) 
} 

我立即找到标准输出0-8,但等待2秒输出9,然后“退出”。

我将此代码移到单个go文件并运行它。起初它输出如上所述的0-8,但是在我改变总数(从10到9,8或3,无论什么)后,它会立即输出所有斐波那契数,因为我是例外(当然它在输出后会输出quit 2秒)!

我在浏览器中运行代码(我使用Chrome)它仍然输出第9个延迟,当我将10更改为3时,它立即输出0-2。

所以我很困惑它为什么输出第9个延迟?

更新:我想我知道为什么,因为我的输出窗口太小而无法输出整个结果,但我始终向下滚动显示所有时间,仍然显示第8个。如果我缩小输出窗口,它将立即输出0-9。那么这是本教程的错误吗?

回答

0

我认为这是本教程的一个错误。如果输出窗口(左下角)太小,则不会显示最后一行,因此第9个将不会立即显示。

如果我在fmt.Println(i,<-c)后面加上fmt.Println("foo"),它不会输出最后一行包含foo的字符串,但是会显示第9个斐波那契。

我在Chrome中捕获响应,它可以告诉如何显示结果,包括它将输出的时间。所以它必须是吞噬最后一行的页面错误。 :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 
     } 
    ] 
}