首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个go代码输出是这样的?

为什么这个go代码输出是这样的?
EN

Stack Overflow用户
提问于 2015-05-21 14:53:58
回答 1查看 47关注 0票数 0

我正在学习here中的Go语言,我像这样修改了一点代码,我在quit <- 0之前添加了一个睡眠(2s),并用i输出斐波纳契数的索引,下面是我的代码:

代码语言:javascript
复制
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吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-21 15:23:21

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

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

我在Chrome中捕获了响应,它可以告诉我如何显示结果,包括它将输出的时间。所以一定是页面的bug吞没了最后一行。:D

PS:回复如下:

代码语言:javascript
复制
{
   "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
      }
   ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30366551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档