gpt4 book ai didi

go - 包源之间的循环依赖

转载 作者:数据小太阳 更新时间:2023-10-29 03:38:34 42 4
gpt4 key购买 nike

假设您有一个包含两个源文件 mypack/a.gomypack/b.go 的包 mypack。这两个源文件相互依赖,但 Go 编译器不会报错。如果将该包拆分为两个 apack/a.gobpack/b.go,Go 编译器会说 import cycle not allowed .

我对如何处理包依赖关系的理解是,编译器将构建一个导入图。对图表进行了分析,并以某种方式(我很想了解执行此操作的算法!)计算了编译顺序。如果图中有环,则无法计算顺序,因此编译器会报错。

我不明白的是 Go 编译器如何能够解决包源之间的依赖关系,但不能解决包之间的依赖关系。如果这两个源相互依赖,那么你必须做一些疯狂的杂技,并以某种方式同时编译它们。

有人可以帮我解决这个问题吗?

最佳答案

[...] how the Go compiler is able to resolve dependencies between sources of a package but not able to resolve dependencies between packages. If the two sources depend on each other then you have to do some crazy acrobatics and compile them both at the same time somehow.

问题是基于关于 Go 代码的结构和编译方式的错误假设:根据定义,源文件确实具有依赖性.包具有依赖性(所有从其所有源文件导入)。依赖项是包(不是源文件)。要编译一个包,所有依赖项都必须在编译开始之前可用。

您真的必须停止考虑源文件。源文件(几乎)对 Go 代码的编译方式没有任何意义。一个包的源可能由一个或多个源文件组成,这基本上是源文件进入编译 Go 代码的唯一点。所有相关的事情都围绕包和包进行:编译包、导入包等。

(只是为了完整性:构建标签在源代码级别工作,包初始化可以依赖于源代码组织,通过手动调用 gc 你可以做的比通过 go 工具做的更多。)

关于go - 包源之间的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52830226/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com