在 Go 中注册包而不创建循环依赖
问题
考虑一个中央包提供几个其他包所依赖的接口。每个依赖包都提供这些接口的多种实现。目标是通知中央包这些实现以启用客户端实例化,但是在中央包中导入依赖包会创建循环依赖。
解决方案
Go 标准库提供了两种方法解决这个问题:
1.没有“中央”注册表
- 在中央包中定义接口并将实现封装在单独的包中。
- 显式实例化所需的实现,指定包名称。
- 示例: crypto 包定义了 Hash 接口,而具体实现可以在单独的包中找到,例如 crypto/md5 和加密/sha256。
2。使用“中央”注册表
- 实现通常通过包 init() 函数在中央包中注册自己。
- 示例:图像包定义图像接口和多种图像格式在 image/gif 和 image/jpeg 等包中实现。
替代解决方案(建议):“自定义”注册表
- 创建一个中间人包(例如,pf),导入中央包(pi)和实现包(例如,pa,pb)。
- 定义“工厂” pf 中的方法来实例化客户端,避免 pf 和其他之间的循环依赖
建议
最佳解决方案取决于需求。如果可以提前进行实施选择,则首选选项 1。选项 2 允许扩展,但需要显式注册。选项 3 提供了便利性和可扩展性之间的折衷方案。
以上是如何在不创建循环依赖的情况下注册Go包?的详细内容。更多信息请关注PHP中文网其他相关文章!