Golang 中的“相互”包导入

2024-05-04

是否可以在 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(使用前将#替换为@)

Golang 中的“相互”包导入 的相关文章

  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 如何导入 AggregatorV3Interface

    我正在尝试导入 AggregatorV3 但找不到该文件 这是我的代码 提前抱歉 我仍然是一名初学者程序员 SPDX License Identifier MIT pragma solidity 0 8 9 import chainlink
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa
  • 使用系统 python osx 进行 pip

    我使用 macports 安装了 python26 所以我的系统上正确的 python 是 opt local bin python 然而 当我这样做时 sudo pip install
  • 指针上定义的方法仍然可以用值调用

    Effective Go 文档说明如下 关于接收者的指针与值的规则是 可以在指针和值上调用值方法 但只能在指针上调用指针方法 http tip golang org doc effective go html pointers vs val
  • 如何组织课程、课程包[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您如何决定包名称应该是什么以及什么类应该放入哪个包中 我正在开发一个项目 在该项目中 我不断添加 删除类 并且不确定我是否需要一个新包 或者应该将其添
  • 在 Python 中打开 Alteryx .yxdb 文件?

    有没有办法将 yxdb Alteryx 数据库文件 导入到 Pandas Python 中 而不使用 Alteryx 作为中间人 简短的回答是否定的 目前还不行 更长的答案 yxdb 支持的原始 C 是可以在 github 上找到 http
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • 如何拥有在标准输出上更新的就地字符串

    我想输出到标准输出并让输出 覆盖 以前的输出 例如 如果我输出On 1 10 我想要下一个输出On 2 10覆盖On 1 10 我怎样才能做到这一点 stdout是一个流 io Writer 您无法修改已写入其中的内容 什么can更改的是该
  • R 提交到 CRAN:构建包的 R 版本?

    我想向 CRAN 提交一个包裹 在里面CRAN 存储库政策 http cran r project org web packages policies html它指出 当发布新的 R x y 0 版本时 R CMD 检查给出 错误 的包将被
  • SSIS Master 包执行来自另一个项目的包

    我有多个SSIS项目 但其中的一些包是相同的 我想创建一个包含所有内容的项目generic包并将其他项目与他们的特定包一起保存 所以我的问题是 是否有可能有一个主包可以执行并将父变量传递给另一个项目的包 我是 SSIS 新手 如果这是一个明
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • 如何处理包内部的 R 数据?

    我正在开发的 R 包需要多个 R 数据对象 例如预先计算的模型和参数 目前 我将包的 数据 目录中的每个对象放在单独的 RData 文件中 使用该包时 用户可以使用 数据 功能将这些对象附加到他们的环境中 我想要的行为是 在加载包时 数据对
  • 如何构建一个不链接到 musl libc 的 go 可执行文件

    So 官方的 Go 构建容器基于 Alpine 高山用途musl https www musl libc org 作为 libc 而不是 glibc 我需要在容器中构建一个可以在使用 glibc 的 Ubuntu 上运行的 Go 可执行文件
  • 导入 SciPy 或 scikit-image,“from scipy.linalg import _fblas:导入错误:DLL 失败”

    我正在导入 from scipy import misc io 但我收到这些错误 Traceback most recent call last File C work asaaki code generateProposals py li
  • 其他人可以使用相同的包名称前缀吗?

    我正在考虑采用包名称 com mangoapps appname 但我的问题是 其他人也可以使用前缀 com mangoapps 吗 由于我想创建一系列应用程序 因此我需要一个唯一的前缀 com mangoapps 还有一个问题 我如何知道
  • 重新设计循环依赖缺陷

    我有一堆小服务 它们共享一些常见的包 例如Logger Configuration and Net 我在单独的项目中编写了每个包 问题是我的Logger需求包Configuration用于设置 和我的Configuration not仅由L
  • 如何从 Ruby 模块中仅导入几个函数?

    假设我有一个带有以下方法的模块 function1 function2 function3 我想导入 function1 和 function2 但不导入 function3 有没有办法在红宝石中做到这一点 不确定是否有一种干净的方法来添加
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以

随机推荐