【发布时间】:2018-10-16 07:37:04
【问题描述】:
假设您有一个包mypack,其中包含两个源文件mypack/a.go 和mypack/b.go。这两个源文件相互依赖,但 Go 编译器不会抱怨。如果你把这个包分成两个,apack/a.go 和bpack/b.go,Go 编译器会说import cycle not allowed。
我对如何处理包依赖项的理解是编译器将构建导入图。该图被分析并以某种方式(我很想了解执行此操作的算法!)计算编译顺序。如果图中有循环,则无法计算顺序,因此编译器会报错。
我不明白的是,Go 编译器如何能够解决包源之间的依赖关系,但无法解决包之间的依赖关系。如果这两个来源相互依赖,那么您必须做一些疯狂的杂技并以某种方式同时编译它们。
谁能帮我解决这个问题?
【问题讨论】:
-
一个包被编译为一个单元,不管使用了多少源文件。这不应该真的那么神秘。
-
此外,您断言“如果有循环则无法计算订单”是完全错误的。计算这些东西是微不足道的——许多语言都这样做。不过,Go 禁止这样做是出于政策考虑,而不是因为这是不可能的。
-
@Flimzy 您的 cmets 值得真正回应。
标签: go compiler-errors compilation package