如何在多个源文件中解析导入语句?
How do import statements get resolved in multiple source files?
我一直试图找到这个问题的答案,但没有成功。
问题是关于当一个包包含多个源文件时 Go 中的 import 语句。
假设我有一个名为 math
的包,其中包含多个文件:
|-- math
|-- add.go
|-- subtract.go
|-- divide.go
|-- multiply.go
让我们假设 math
包使用 fmt
包,因此它需要适当的导入语句。但是由于我们有四个单独的文件,我们必须多次导入 fmt
包(至少在我看来是这样):
// add.go
import "fmt"
// subtract.go
import "fmt"
// divide.go
import "fmt"
// multiply.go
import "fmt"
现在的问题是,编译包的时候会发生什么?这些语句只是简单地合并在一起吗?
如果是这样,为什么我们必须多次导入包(每个文件一次)而不是只有一个包含所有导入语句的文件,以免重复我们自己?
The scope of the package name of an imported package is the file block of the file containing the import declaration.
因为导入没有包范围,导入不会合并在一起,并且在使用导入的每个文件中都是必需的。
导入的范围与编译器和链接器加载导入包的方式无关。这些工具足够智能,可以一次加载任何给定的包。
我一直试图找到这个问题的答案,但没有成功。
问题是关于当一个包包含多个源文件时 Go 中的 import 语句。
假设我有一个名为 math
的包,其中包含多个文件:
|-- math
|-- add.go
|-- subtract.go
|-- divide.go
|-- multiply.go
让我们假设 math
包使用 fmt
包,因此它需要适当的导入语句。但是由于我们有四个单独的文件,我们必须多次导入 fmt
包(至少在我看来是这样):
// add.go
import "fmt"
// subtract.go
import "fmt"
// divide.go
import "fmt"
// multiply.go
import "fmt"
现在的问题是,编译包的时候会发生什么?这些语句只是简单地合并在一起吗?
如果是这样,为什么我们必须多次导入包(每个文件一次)而不是只有一个包含所有导入语句的文件,以免重复我们自己?
The scope of the package name of an imported package is the file block of the file containing the import declaration.
因为导入没有包范围,导入不会合并在一起,并且在使用导入的每个文件中都是必需的。
导入的范围与编译器和链接器加载导入包的方式无关。这些工具足够智能,可以一次加载任何给定的包。