首页 > 后端开发 > Golang > 如何在不创建循环依赖的情况下注册Go包?

如何在不创建循环依赖的情况下注册Go包?

Patricia Arquette
发布: 2024-12-27 21:28:11
原创
280 人浏览过

How to Register Go Packages Without Creating Circular Dependencies?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板