戈朗 : why does the word "hello" loop 5 times while the word "world" loops only 4?

标签 go goroutine

<分区>

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(1000 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

运行代码,输出为:

hello
world
hello
world
hello
world
hello
world
hello

在前 4 个循环中,每 100 毫秒,将打印一个“hello”,然后打印一个“world”。并且在最后一个循环中只会打印一个“hello”。

有没有人可以解释一下代码的执行顺序是什么?

最佳答案

程序可能会在最后一个世界打印出来之前终止。 – 大卫·施瓦茨

Go 程序不会等到所有 goroutine 完成后才退出。如果你想等待“世界”完成打印,你可以使用 WaitGroup .

例如

将“sync”添加到您的导入中,并通过以下方式调用它:

func main() {
    var wg sync.WaitGroup    
    wg.Add(1)
    go func() {
        defer wg.Done()
        say("world")
    }()
    say("hello")
    wg.Wait()
}

关于戈朗 : why does the word "hello" loop 5 times while the word "world" loops only 4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31041133/

相关文章:

go - 序列化为JSON动态结构

google-app-engine - 在响应中设置 Access-Control-Allow-Credentials header

go - 如何停止从 UDP 读取的 goroutine?

go - 将 context.Context 传递给在单独的 goroutine 中执行的闭包的最佳方法

sql - 模式交换支持 Go GORM

go - 从文件中读取字节到内存中

go - 在 go http 处理程序中使用 goroutine 和 channel 使 ResponseWriter 被阻塞

go - 在 Go Tour 等价二叉树上使用多个 Goroutine

go - 当 main 退出时,goroutines 会运行 defer() 吗?

google-app-engine - dev_appserver 使用 goroot 1.6 而不是 1.8