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

Ale*_*lke 2 concurrency unit-testing initialization go goroutine

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

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

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

func init() {
    ...
    initHttpEndPoints();
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

icz*_*cza 5

规格:包初始化:

\n\n
\n

包初始化\xe2\x80\x94变量初始化和init函数\xe2\x80\x94的调用发生在单个goroutine中,按顺序一次一个包。init 函数可以启动其他 goroutine,这些 goroutine 可以与初始化代码同时运行。然而,初始化总是对 init 函数进行排序:在前一个函数返回之前,它不会调用下一个函数。

\n
\n\n

从函数启动 goroutine 没有任何问题init(),但您必须记住这些 goroutine 与初始化过程同时运行,因此例如您不能假设有关(当前)包的初始化状态的任何信息。

\n\n

如果您看到您的init()函数多次运行,则很可能是多个测试单独运行。init()函数在包的生命周期内仅运行一次。

\n