猿问

init() 函数可以安全地启动 go 例程,包括测试吗?

我有一个应用程序。它创建一个 HTTP 服务来监听一些连接点,我们可以用它来检查应用程序状态。

该服务在后台运行(带有 go 例程)。

它在函数中被初始化,init()其中包括:

func init() {
    ...
    initHttpEndPoints();
    ...
}

在测试此应用程序时,在函数中创建 go 例程是否会init()导致问题?

我问这个问题是因为看起来我的测试重新运行了init()第二次,我想知道为什么会这样以及副作用可能是什么......(如果所有的 go 例程突然都发生的话,可能不太好重复。)

注意:完整的应用程序。在函数中创建数百个 go 例程init()。我使用 HTTP 端点作为示例。

强烈相关的答案:测试是否同时运行?


紫衣仙女
浏览 95回答 2
2回答

冉冉说

除了 icza 的答案之外,听起来您init()对软件包的使用不正确testing。init()您应该定义 function ,而不是使用它来初始化测试所需的东西TestMain()。

慕慕森

规格:包初始化:包初始化(变量初始化和 init 函数的调用)发生在单个 goroutine 中,按顺序一次一个包。init 函数可以启动其他 goroutine,这些 goroutine 可以与初始化代码同时运行。然而,初始化总是对 init 函数进行排序:在前一个函数返回之前,它不会调用下一个函数。从函数启动 goroutine 没有任何问题init(),但您必须记住这些 goroutine 与初始化过程同时运行,因此例如您不能假设有关(当前)包的初始化状态的任何信息。如果您看到您的init()函数多次运行,则很可能是多个测试单独运行。init()函数在包的生命周期内仅运行一次。
随时随地看视频慕课网APP

相关分类

Go
我要回答