import - "Mutual"Golang 包导入

标签 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 错误。问题是,是否有更简洁或更成熟的方法来解决此问题然后构建“桥包”?

最佳答案

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

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

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

If package X accepts/stores/calls methods on/returns types defined package Y, but doesn't actually access Y's (non-method) functions or variables directly, X can use an interface that the type in Y satisfies rather than actually importing Y.

avoiding dependencies with interfaces in general, you can see how, say, the io module doesn't depend on os for the File class even though its functions can work on Files. (It just defines io.Writer, etc., and *os.File satisfies those interfaces.)

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

关于import - "Mutual"Golang 包导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526484/

相关文章:

Python:使用 lxml 从 Open Office calc 导入数据

actionscript-3 - Flash/AS3 拒绝导入

Go dev.boringcrypto 分支 - x/crypto 库 FIPS 140-2 合规性

go - golang 中动态大小的数组?

r - 如何记录 r 包的数据集?

java - 可以在 Eclipse 中导入非归档项目目录吗?

从 Flutter 中的父目录导入

go - 为什么golang的RSA签名结果与OpenSSL命令的不同?

android - 三星 GT-P5100 的计算器包名称是什么?

r - 在 R 包文档 (.Rd) 文件中包含图像