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
goroutines的Return vs.Goexit_Go - Fatal编程技术网

goroutines的Return vs.Goexit

goroutines的Return vs.Goexit,go,Go,我做了一些挖掘,但没有发现任何令人满意的东西,所以我想问:他们使用return vs.runtime.Goexit退出goroutine的最佳实践或优缺点是什么?到目前为止,我在一些测试中遇到的唯一问题是,如果使用waitgroups,它可能不会调用Done函数 特定于waitgroups(如果感兴趣):在代码库中的一些快速测试中,我创建了一个匿名函数,作为goroutine执行,以测试应该在goroutine中运行的方法。当函数调用runtime.Goexit时,我尝试使用defer让它调用w

我做了一些挖掘,但没有发现任何令人满意的东西,所以我想问:他们使用return vs.runtime.Goexit退出goroutine的最佳实践或优缺点是什么?到目前为止,我在一些测试中遇到的唯一问题是,如果使用waitgroups,它可能不会调用Done函数

特定于waitgroups(如果感兴趣):在代码库中的一些快速测试中,我创建了一个匿名函数,作为goroutine执行,以测试应该在goroutine中运行的方法。当函数调用runtime.Goexit时,我尝试使用defer让它调用wg.Done,但没有成功。不确定这是故意的还是错误

代码示例:

go func() {
    wg.Add(1)
    defer wg.Done()
    // Function goes here...
}()

您应该很少需要使用runtime.Goexit。当您无法从调用站点返回时(例如,当您在goroutine中进行函数调用时),它用于终止当前goroutine。在std库中,测试包在FailNow和SkipNow等函数中使用它来立即结束当前测试。通常,您应该从goroutines正常返回,以保持代码清晰,并防止意外行为

您的示例中的问题是,您需要在启动goroutine之前调用wg.Add,否则您可能会在执行wg.Add调用之前到达Wait调用

wg.Add(1)
go func() {
    defer wg.Done()
    // Function goes here...
}()

您应该很少需要使用runtime.Goexit。当您无法从调用站点返回时(例如,当您在goroutine中进行函数调用时),它用于终止当前goroutine。在std库中,测试包在FailNow和SkipNow等函数中使用它来立即结束当前测试。通常,您应该从goroutines正常返回,以保持代码清晰,并防止意外行为

您的示例中的问题是,您需要在启动goroutine之前调用wg.Add,否则您可能会在执行wg.Add调用之前到达Wait调用

wg.Add(1)
go func() {
    defer wg.Done()
    // Function goes here...
}()

waitgroup只是一个例子,尽管我很欣赏这个答案。我更感兴趣的是使用每种方法的优缺点或最佳实践。@blockcipher:添加了关于Goexit使用的说明。它的用途真的不多,它看起来本质上是一种无法恢复的恐慌。我能看到的最有可能的情况是,您公开了一个API,它的意思类似于退出,FailNow就是这样。我更感兴趣的是使用每种方法的优缺点或最佳实践。@blockcipher:添加了关于Goexit使用的说明。它的用途真的不多,它看起来本质上是一种无法恢复的恐慌。我所能看到的最可能的情况是,当您公开了一个API,这意味着退出,就像FailNow一样。