-2

我正在尝试在下面的代码中运行它

package main

import (
    "fmt"
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
    fmt.Println("Done")
}

正如预期的那样,它等待 6 秒,打印“完成”,然后退出

但是如果我删除打印语句,

package main

import (
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
}

它不会等待并立即退出。为什么?

因此,请看下面的代码

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)
    go count(6, c)
    time.Sleep(time.Millisecond*5000)
}

func count(num int, c chan int) {
    for i := 1; i <= num; i++ {
        fmt.Println(i)
        c <- i
        time.Sleep(time.Millisecond*2000)
    }
    close(c)
}

在这里,当没有接收者可以读取时, countgoroutine 将被阻止尝试发送到通道,并且即使在它之后有一条语句,该函数也会立即退出。但是当我删除声明时imainsleep

c <- i

countgoroutine 会一直计数到 3,因为函数main确实会等待 5 秒,如前所述。

这里发生了什么?

4

1 回答 1

3

在本地运行它,它会等待。Go Playground 上的输出被缓存。如果没有输出,它不会让你等待 6 秒。如果有输出,则保留输出的时序。

阅读博文:Go 博客:Go Playground 内部:

我们捕获每次写入标准输出和标准错误的时间,并将其提供给客户端。然后客户端可以以正确的时间“回放”写入,这样输出就好像程序在本地运行一样。

于 2019-09-24T12:05:35.583 回答