是否可以在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()
}

有没有一种方法可以在不使用第三包作为"桥梁"的情况下实现这一目标?

编辑:
为了稍微澄清这个问题,通过"简单地这样做"当然是不可能的,因为编译器将抛出import cycle not allowed错误。 问题是,是否有更清洁或更成熟的方法来解决此问题,然后构建"桥接程序包"?

  • 不,禁止循环进口。

接口应该是一个明显的答案:只要两个程序包都建议使用一组通用功能的接口,它就可以:

  • 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 package Y, but doesn't actually access Y's (non-method) functions or variables directly, X can use an interface that the type in Y satisfies rather than actually importing Y.

avoiding dependencies with interfaces in general, you can see how, say, the io module doesn't depend on os for the File class even though its functions can work on Files. (It just defines io.Writer, etc., and *os.File satisfies those interfaces.)

例如,io在其Copy()函数中接受一个"作家"(可以是一个文件或其他知道如何编写的东西),而完全忽略了os(。File)