Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 为什么可以';这个程序不能用goroutine打印任何东西吗?_Concurrency_Go - Fatal编程技术网

Concurrency 为什么可以';这个程序不能用goroutine打印任何东西吗?

Concurrency 为什么可以';这个程序不能用goroutine打印任何东西吗?,concurrency,go,Concurrency,Go,我最近通过谷歌调查了Golang,我遇到了以下问题。然后程序就不会打印任何东西。但如果我删除“go”符号,它将同时打印“goroutine”和“going” 您的程序在goroutines执行之前退出。您可以稍等一会儿,例如通过调用time.Sleep(2*time.Second),但这种行为被认为是不好的做法,因为您的程序可能会运行超过2秒,然后仍然会终止 更好的方法是使用sync.WaitGroup: package main import ( "fmt" "sync" )

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


您的程序在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()
}

代码需要等待例程完成后才能退出。这样做的一个好方法是传入一个通道,例程使用该通道在完成时发出信号,然后在主代码中等待。见下文

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

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
}
主程序包
进口(
“fmt”
)
func f(消息字符串,退出chan int){
fmt.Println(味精)

退出,因为在运行goroutine之前会退出main。另外,每隔一天就会问一次这个问题。这是最糟糕的建议。使用channels或
sync.WaitGroup
。如果goroutine花费的时间超过2秒,那么就错了。您的答案应该是一个有效的示例,一个好代码的指南。您的答案都不是处于这种状态。谢谢添加正在处理WaitGroup示例。为了更清晰,我删除了sleep示例,希望您不介意:)
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
}