是否可以在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
错误。问题是,是否有更清洁或更成熟的解决这个问题的方法,然后建立一个“桥梁包”?
答案 0 :(得分:6)
interface应该是一个明显的答案:只要两个包都提出具有一组通用函数的接口,它就允许:
packageB
使用A
(import 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 classio.Writer
,即使它的函数可以在{{1}上运行}}。 (它只定义*os.File
satisfies those interfaces等,以及Copy()
function。)
例如,Files
在其{{3}}(可以是文件或其他知道如何编写的文件)中接受'Writer',并完全忽略io
(。文件)