是否可以在 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
错误。问题是,是否有一种更干净或更成熟的方法来解决这个问题,然后构建“桥梁包”?
界面 http://golang.org/doc/effective_go.html#interfaces_and_types应该是一个显而易见的答案:只要两个包都提供具有一组通用功能的接口,它就允许:
-
packageB
使用来自的函数A
(import A
)
-
packageA
从中调用函数B
无需import B
: 所有需要通过的B
实现接口中定义的实例A
:这些实例将被视为A
object.
从这个意义上说,packageA
忽略了的存在packageB
.
这一点在“golang中的循环依赖和接口 https://stackoverflow.com/questions/20380333/cyclic-dependencies-and-interfaces-in-golang#comment30438237_20380333".
如果包X
接受/存储/调用方法/返回定义包的类型Y
,但实际上并没有访问Y
直接的(非方法)函数或变量,X
可以使用输入的接口Y
满足而不是实际导入Y
.
一般来说,避免与接口的依赖关系,您可以看到如何io module http://golang.org/pkg/io/不依赖于os http://golang.org/pkg/os/为了文件类 http://golang.org/pkg/os/#File即使它的功能可以工作Files
。 (它只是定义io.Writer http://golang.org/pkg/io/#Writer等,以及*os.File满足这些接口 http://golang.org/pkg/os/#File.Write.)
例如,io
在其中接受“作家”Copy()功能 http://golang.org/pkg/io/#Copy(可以是文件或其他知道如何写入的文件),并完全忽略os
(.File)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)