Golang中的"Mutual"包导入

6

在 Golang 中是否有可能实现类似于“相互”包导入的操作?

以 A 和 B 两个包为例,假设它们分别拥有如下函数:AFunc、BFunc 和 BFunc2。

package A
import "B"

func AFunc() {
    //do stuff but also use
    B.BFunc()
}

-

package B
import "A"

func BFunc() {
    //do foo
}

func BFunc2() {
    //do different stuff but also use
    A.AFunc()
}

有没有一种方法可以不使用第三方“桥接”软件包来实现这一点?
编辑: 为了澄清问题,当然不能通过“简单地执行”来实现,因为编译器会抛出“不允许导入循环”错误。问题是,有没有比构建“桥接软件包”更清晰或更成熟的解决此问题的方法?

不可以使用循环导入。 - Volker
1个回答

11

接口应该是一个显而易见的答案:只要两个包都提出了具有共同函数集的接口,就可以实现以下功能:

  • 包B 使用来自A (import A)的函数
  • 包A 调用来自B的函数而不必import B:它只需要传递在A中定义的接口的实现的B实例:这些实例将被视为A对象。
    在这个意义上,包A 忽略了 包B 的存在。

这也可以在“Cyclic dependencies and interfaces in golang”中的评论中说明。

如果包X 接受/存储/调用来自包Y定义类型的方法,但实际上没有直接访问Y的(非方法)函数或变量,则X 可以使用Y类型满足的接口,而无需实际导入Y

在一般情况下,通过接口避免依赖关系,你可以看到如何实现,比如说,io模块并不依赖于os来获取File类,即使它的函数可以在Files上工作。(它只是定义了io.Writer等,并且*os.File满足这些接口。)

例如,在其Copy()函数中,io接受一个' Writer '(可以是文件或其他知道如何写入的对象),并完全忽略了os(.File)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接