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

-3 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
}
Run Code Online (Sandbox Code Playgroud)

Kav*_*avu 8

您在执行goroutine之前编程退出.你可以等一下,例如通过调用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()
}
Run Code Online (Sandbox Code Playgroud)

  • Uargh.这是最糟糕的建议.使用频道或`sync.WaitGroup`. (2认同)
  • 感谢您添加WaitGroup示例.我删除了睡眠示例以获得更好的易读性,我希望你不介意:) (2认同)

Usm*_*ail 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
}
Run Code Online (Sandbox Code Playgroud)