为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
紫衣仙女 2023-07-10 16:22:39
我有一个应用程序。它创建一个 HTTP 服务来监听一些连接点,我们可以用它来检查应用程序状态。该服务在后台运行(带有 go 例程)。它在函数中被初始化,init()其中包括:func init() {     ...     initHttpEndPoints();     ... }在测试此应用程序时,在函数中创建 go 例程是否会init()导致问题?我问这个问题是因为看起来我的测试重新运行了init()第二次,我想知道为什么会这样以及副作用可能是什么......(如果所有的 go 例程突然都发生的话,可能不太好重复。)注意:完整的应用程序。在函数中创建数百个 go 例程init()。我使用 HTTP 端点作为示例。强烈相关的答案:测试是否同时运行?
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

除了 icza 的答案之外,听起来您init()对软件包的使用不正确testing

init()您应该定义 function ,而不是使用它来初始化测试所需的东西TestMain()


查看完整回答
反对 回复 2023-07-10
?
慕慕森

TA贡献1856条经验 获得超17个赞

规格:包初始化:

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

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

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


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信