【问题标题】:"Mutual" package import in GolangGolang 中的“相互”包导入
【发布时间】:2014-08-22 23:17:56
【问题描述】:

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

有没有办法在不使用第三个包作为“桥梁”的情况下实现这一点?

编辑: 为了稍微澄清一下这个问题,“简单地做”这当然是不可能的,因为编译器会抛出一个import cycle not allowed 错误。问题是,是否有一种更清洁或更成熟的方法来解决这个问题,然后构建一个“桥梁包”?

【问题讨论】:

  • 不,禁止循环导入。

标签: import go package


【解决方案1】:

interface 应该是一个显而易见的答案:只要两个包都提出具有一组通用功能的接口,它就允许:

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

Cyclic dependencies and interfaces in golang”的评论中也说明了这一点。

如果包X接受/存储/调用方法/返回类型定义的包Y,但实际上并不直接访问Y的(非方法)函数或变量,X可以使用Y 中的类型满足而不是实际导入 Y 的接口。

通常避免与接口的依赖关系,您可以看到io module 不依赖于osFile class,即使它的功能可以在Files 上工作。 (它只定义了io.Writer等,以及*os.File satisfies those interfaces。)

例如,io 在其Copy() function 中接受“Writer”(可以是文件或其他知道如何写入的文件),并完全忽略 os(.File)

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 2016-06-11
    • 2016-03-10
    • 2017-05-02
    • 2019-12-07
    • 2015-05-24
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多