如何在多个源文件中解析导入语句?

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"

现在的问题是,编译包的时候会发生什么?这些语句只是简单地合并在一起吗?

如果是这样,为什么我们必须多次导入包(每个文件一次)而不是只有一个包含所有导入语句的文件,以免重复我们自己?

specification says:

The scope of the package name of an imported package is the file block of the file containing the import declaration.

因为导入没有包范围,导入不会合并在一起,并且在使用导入的每个文件中都是必需的。

导入的范围与编译器和链接器加载导入包的方式无关。这些工具足够智能,可以一次加载任何给定的包。