是否可以在Golang中执行"相互"包导入之类的操作?
可以说,例如,我有两个包,A和B,其功能为AFunc和BFunc,BFunc2
1 2 3 4 5 6 7 | package A import"B" func AFunc() { //do stuff but also use B.BFunc() } |
--
1 2 3 4 5 6 7 8 9 10 11 | package B import"A" func BFunc() { //do foo } func BFunc2() { //do different stuff but also use A.AFunc() } |
有没有一种方法可以在不使用第三包作为"桥梁"的情况下实现这一目标?
编辑:
为了稍微澄清这个问题,通过"简单地这样做"当然是不可能的,因为编译器将抛出
- 不,禁止循环进口。
接口应该是一个明显的答案:只要两个程序包都建议使用一组通用功能的接口,它就可以:
-
packageB 使用A (import A )中的功能 -
packageA 可以从B 调用函数而不必import B :所有需要传递的B 实例实现了A 中定义的接口:这些实例将作为A 对象的视图。
从这个意义上讲,packageA 忽略了packageB 的存在。
在" golang中的循环依赖关系和接口"的注释中也对此进行了说明。
If package
X accepts/stores/calls methods on/returns types defined packageY , but doesn't actually accessY 's (non-method) functions or variables directly,X can use an interface that the type inY satisfies rather than actually importingY .avoiding dependencies with interfaces in general, you can see how, say, the
io module doesn't depend onos for the File class even though its functions can work onFiles . (It just definesio.Writer , etc., and*os.File satisfies those interfaces.)
例如,