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编译器不能简单地连接两个源文件并将它们编译为一个大单元,因为存在循环依赖关系。编译器无法将一个文件放在另一个文件之前。尽管如此,编译器仍然能够找到它。这是我的问题