Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Function 为什么这些goroutines没有打印到控制台?_Function_Go_Concurrency_Goroutine - Fatal编程技术网

Function 为什么这些goroutines没有打印到控制台?

Function 为什么这些goroutines没有打印到控制台?,function,go,concurrency,goroutine,Function,Go,Concurrency,Goroutine,在某些情况下,我无法解释戈罗蒂人的行为。我试着举个简单的例子。 这是我自己的文件main.go: 我希望在一个周期中调用三次的3个函数都是并发执行的,结果是打印编号的顺序是不可预测的。 我不明白为什么程序编译和执行时没有任何错误,但它不会在控制台上打印任何东西! 实际上,就好像没有执行for中的函数调用一样。如果我删除go子句,打印结果将显示在控制台上。我得出的结论是并行线程无权在我的控制台上打印。如何查看这些具有实际并发行为的打印 如何查看这些具有实际并发行为的打印 一旦生成goroutine

在某些情况下,我无法解释戈罗蒂人的行为。我试着举个简单的例子。 这是我自己的文件main.go:

我希望在一个周期中调用三次的3个函数都是并发执行的,结果是打印编号的顺序是不可预测的。 我不明白为什么程序编译和执行时没有任何错误,但它不会在控制台上打印任何东西! 实际上,就好像没有执行for中的函数调用一样。如果我删除go子句,打印结果将显示在控制台上。我得出的结论是并行线程无权在我的控制台上打印。如何查看这些具有实际并发行为的打印

如何查看这些具有实际并发行为的打印


一旦生成goroutines,让main等待或执行其他操作。现在,它只返回终止程序及其goroutines的命令。

要获得预期结果,请等待goroutines完成,然后退出程序

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func print1() {
    fmt.Println("print 1")
    wg.Done()
}

func print2() {
    fmt.Println("print 2")
    wg.Done()
}

func print3() {
    fmt.Println("print 3")
    wg.Done()
}

func main() {

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print1()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print2()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print3()
    }

    wg.Wait()
}

和的可能重复。一个解决方案涉及错误组
package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func print1() {
    fmt.Println("print 1")
    wg.Done()
}

func print2() {
    fmt.Println("print 2")
    wg.Done()
}

func print3() {
    fmt.Println("print 3")
    wg.Done()
}

func main() {

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print1()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print2()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go print3()
    }

    wg.Wait()
}