为什么这个程序不能使用goroutine打印任何东西?

时间:2014-02-13 17:23:49

标签: concurrency go

我最近通过谷歌调查Golang,我遇到了以下问题。然后程序不打印任何东西。但如果我删除“go”符号,它将打印“goroutine”和“going”。

package main

import "fmt"

func f(msg string) {
    fmt.Println(msg)
    return
}

func main() {
    go f("goroutine")

    go func(msg string) {
        fmt.Println(msg)
        return
    }("going")

    return
}

2 个答案:

答案 0 :(得分:8)

您在执行goroutines之前编程退出。您可以稍等一下,例如通过调用time.Sleep(2 * time.Second),但这种行为被认为是不好的做法,因为您的程序可能运行时间超过2秒,然后会终止。

更好的方法是使用sync.WaitGroup

package main

import (
    "fmt"
    "sync"
)

func f(msg string, wg *sync.WaitGroup) {
    fmt.Println(msg)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup

    wg.Add(1)
    go f("goroutine", &wg)

    wg.Add(1)
    go func(msg string) {
        fmt.Println(msg)
        wg.Done()
    }("going")

    wg.Wait()
}

答案 1 :(得分:5)

您的代码需要等待例程完成才能退出。执行此操作的一种好方法是传入一个通道,该通道由例程用于在完成时发出信号,然后在主代码中等待。见下文。

这种方法的另一个优点是它允许/鼓励您根据返回值执行正确的错误处理。

package main

import (
    "fmt"
)

func f(msg string, quit chan int) {
    fmt.Println(msg)
    quit <- 0
    return
}

func main() {

    ch1 := make(chan int)
    ch2 := make(chan int)

    go f("goroutine", ch1)

    go func(msg string, quit chan int) {
        fmt.Println(msg)
        quit <- 0
        return
    }("going", ch2)

    <-ch1
    <-ch2
    return
}