gpt4 book ai didi

multithreading - 为什么这个 go 代码输出这样?

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:34 25 4
gpt4 key购买 nike

我在 here 学习 Go 语言,我修改了一些这样的代码,我在 quit <- 0 之前添加了一个 sleep(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。那么这是本教程的错误吗?

最佳答案

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

如果我添加 fmt.Println("foo")fmt.Println(i,<-c) 之后, 它不会输出最后一行包含 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
}
]
}

关于multithreading - 为什么这个 go 代码输出这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30366551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com