Go 包的`init()`函数中的Infite for循环-好主意还是坏主意?

Go 包的`init()`函数中的Infite for循环-好主意还是坏主意?,go,Go,我想知道在包的init函数中使用无限for循环是个坏主意,还是应该避免这样做 如果可以做到或应该避免,是否有人拥有任何知识或经验 你会在哪里使用这个? 例如,这可以用于从外部源提供一些信息的包,这些信息必须定期刷新,例如每天一次 我使用了如下类似的代码,但没有看门狗功能。这意味着init刚刚启动了一个go例程,该例程将在后台运行,并在出现滴答声时运行更新过程 不幸的是,此更新机制在aprox之后停止工作。3个月,原因不明,但服务运行良好,仅使用旧数据 简单示例实现 关于 包裹信息 进口 日志 同

我想知道在包的init函数中使用无限for循环是个坏主意,还是应该避免这样做

如果可以做到或应该避免,是否有人拥有任何知识或经验

你会在哪里使用这个? 例如,这可以用于从外部源提供一些信息的包,这些信息必须定期刷新,例如每天一次

我使用了如下类似的代码,但没有看门狗功能。这意味着init刚刚启动了一个go例程,该例程将在后台运行,并在出现滴答声时运行更新过程

不幸的是,此更新机制在aprox之后停止工作。3个月,原因不明,但服务运行良好,仅使用旧数据

简单示例实现 关于

包裹信息 进口 日志 同步 时间 变量 数据映射[字符串]接口{} 锁同步.RWMutex 函数初始化{ //股票频道 股票代码:=time.NewTicker1*time.Second.C //看门狗环路 为了{ log.println启动更新循环 var wg sync.WaitGroup 工作组增补1 //启动asyc更新过程。 围棋{ 延迟工作组。完成//如果过程因任何原因结束,通知工作组 //永远循环 //当收到来自“ticker”频道的滴答声时运行 为了{ 挑选{
case它在goroutine中,所以技术上很好,但是在init中直接实现行为会导致很难使用它,原因有二:

它很难测试,就像main很难测试一样。如果init调用另一个函数,那么测试就容易多了,然后就可以测试了。 这很难解释。自动发生的事情越多,对任何开发人员,包括你未来的自我使用该软件包的人来说,意义就越小。好吧,我导入了这个软件包,使用了一个很小的函数,现在不知怎的,我的CPU使用率从1%提高到了50%,我做错了什么,这类事情会出现,需要更多的探索比他们应该做的要多。
TL;DR不存在长期稳定性问题,但很可能存在长期可维护性问题。

1年或更长的正常运行时间意味着您没有足够频繁地更新内核。不要这样做。无论如何,您应该期待失败。一般来说,使用init函数是个坏主意…@Flimzy可以详细说明原因。谢谢您的回答。我完全同意可维护性部分。代码主要用于说明:-