Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 包的源之间的循环依赖关系_Go_Compiler Errors_Compilation_Package - Fatal编程技术网

Go 包的源之间的循环依赖关系

Go 包的源之间的循环依赖关系,go,compiler-errors,compilation,package,Go,Compiler Errors,Compilation,Package,假设您有一个包mypack,其中包含两个源文件mypack/a.go和mypack/b.go。这两个源文件相互依赖,但Go编译器不会抱怨。如果将该包分成两部分,apack/a.go和bpack/b.go,则go编译器将说导入周期不允许 我对如何处理包依赖关系的理解是,编译器将构造一个导入图。对图形进行了分析,并以某种方式计算了编译顺序(我很想了解执行此操作的算法!)。如果图形中存在循环,则无法计算顺序,因此编译器会抱怨 我不明白的是,Go编译器如何能够解析包源之间的依赖关系,而不能解析包之间的依

假设您有一个包
mypack
,其中包含两个源文件
mypack/a.go
mypack/b.go
。这两个源文件相互依赖,但Go编译器不会抱怨。如果将该包分成两部分,
apack/a.go
bpack/b.go
,则go编译器将说
导入周期不允许

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

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


有人能帮我澄清一下吗?

一个包被编译成一个单元,不管使用了多少个源文件。这真的不应该那么神秘

此外,您的断言“如果存在循环,则无法计算订单”是完全错误的。计算这些东西很简单——许多语言都这样做。不过,作为一项政策,Go禁止这样做,因为这会导致代码和难以理解的代码之间的紧密耦合,而不是因为这是不可能的

[…]Go编译器如何能够解析包源之间的依赖关系,但无法解析包之间的依赖关系。如果这两个源代码相互依赖,那么您必须执行一些疯狂的杂技,并以某种方式同时编译它们

这个问题是基于对Go代码是如何构造和编译的错误假设:源文件是否具有定义上的依赖性。包具有依赖项(从其所有源文件的所有导入)。依赖项是包(不是源文件)。要编译包,在编译开始之前,所有依赖项都必须可用

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


(只是为了完整性:构建标记在源代码级别上工作,包初始化可能取决于源代码组织,通过手动调用gc,您可以做的不仅仅是通过go工具。)

包被编译为单个单元,而不管使用了多少源文件。这其实不应该那么神秘。此外,你的断言“如果有一个循环,就无法计算顺序”是完全错误的。计算这些东西很简单——许多语言都这样做。不过,作为一项政策,Go禁止这样做,并不是因为这是不可能的。@Flimzy你的评论值得一个真正的回应。你还没有真正回答我的问题。Go编译器不能简单地连接两个源文件并将它们编译为一个大单元,因为存在循环依赖关系。编译器无法将一个文件放在另一个文件之前。尽管如此,编译器仍然能够找到它。这是我的问题