我做了一些挖掘,但没有找到任何令人满意的东西,所以我问:他们是否有任何最佳实践或使用return和runtime.Goexit退出goroutine的优点/缺点?到目前为止,我在一些测试中遇到的唯一问题是,如果你使用的是waitgroups,它可能不会调用Done函数。
特定于waitgroups(如果感兴趣):在我的代码库中的一些快速测试中,我创建了一个匿名函数,作为goroutine执行,以测试应该在goroutine中运行的方法。我试图使用defer让它调用wg.Done()当函数调用runtime.Goexit时,但它没有用。不确定这是故意还是错误。
代码示例:
go func() {
wg.Add(1)
defer wg.Done()
// Function goes here...
}()
答案 0 :(得分:7)
您应该很少需要使用runtime.Goexit
。当无法从呼叫站点返回时,它用于终止当前goroutine,例如当你在goroutine中进行函数调用时。在std库中,测试包在FailNow
和SkipNow
等函数中使用它来立即结束当前测试。通常,您应该从goroutine正常返回以保持代码清晰,并防止意外行为。
您的示例中的问题是,您需要在启动goroutine之前致电wg.Add
,否则您可以在Wait
之前拨打wg.Add
来电电话已被执行。
wg.Add(1)
go func() {
defer wg.Done()
// Function goes here...
}()