当不同的包相互依赖时,在没有循环依赖的 Go 中注册包可能是一个挑战。当中心包提供接口,而依赖包提供这些接口的实现时,就会出现此问题。
1.没有中央注册表:
在这种方法中,具体实现是在单独的包中定义的,而中央包只是声明接口。当需要特定的实现时,会显式实例化它,例如 md5.New() 或 sha256.New()。该解决方案促进分离并消除循环依赖。
2.使用中央注册表:
此方法涉及创建一个注册机制,其中实现将自身注册到中央包。然后,中央包可以提供查找功能来选择和创建适当的实现。 Go 中的图像包就利用了这种方法,根据图像格式注册动态加载图像解码器。
3.自定义注册表:
第三个选项是在单独的包中创建自定义注册表,充当接口和实现之间的中介。这种方法允许使用中央“工厂”方法来创建实例,同时保持包分离。例如,接口可以驻留在包 pi 中,实现可以驻留在包 pa 和 pb 中,注册表包 pf 将提供 pf.NewClient() 工厂方法。
最终,方法的选择取决于具体情况项目的要求。如果实现选择是已知的或静态的,则无需使用自定义注册表。然而,对于动态扩展和可扩展性,注册表机制提供了灵活性和组织性。
以上是如何在不创建循环依赖的情况下注册Go包?的详细内容。更多信息请关注PHP中文网其他相关文章!