"相互" Golang中的包导入

时间:2014-07-02 08:34:53

标签: import go package

是否可以在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错误。问题是,是否有更清洁或更成熟的解决这个问题的方法,然后建立一个“桥梁包”?

1 个答案:

答案 0 :(得分:6)

interface应该是一个明显的答案:只要两个包都提出具有一组通用函数的接口,它就允许:

  • packageB使用Aimport A
  • 中的功能
  • packageA无需B就可以调用import B中的函数:只需要传递实现B中定义的接口的A个实例:这些实例将是A对象的视图 从这个意义上说,packageA忽略了packageB
  • 的存在

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

  

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

     

通常避免与接口的依赖关系,你可以看到,io module如何os不依赖于File class io.Writer,即使它的函数可以在{{1}上运行}}。 (它只定义*os.File satisfies those interfaces等,以及Copy() function。)

例如,Files在其{{3}}(可以是文件或其他知道如何编写的文件)中接受'Writer',并完全忽略io(。文件)