10.4. 导入声明
一个Go源文件可以在包声明语句之后, 其他非导入声明之前, 包含零到多个导入包声明. 每个导入声明可以单独指定一个导入路径, 通过圆括号包含指定多个导入路径. 下面两个导入形式是等价的, 但是第二种形式更为常见.
import "fmt"
import "os"
import (
"fmt"
"os"
)
导入的包之间可以通过添加空行来分组; 通常将来自不同组织的包独自分组. 导入顺序无关紧要, 但是一般会根据字符串顺序排列. (gofmt和goimports的都可以将不同分组的包独立排序.)
import (
"fmt"
"html/template"
"os"
"golang.org/x/net/html"
"golang.org/x/net/ipv4"
)
如果我们想同时导入两个名字相同的包, 例如 math/rand 和 crypto/rand, 导入声明必须至少为一个同名包指定一个新的包名, 以避免冲突. 这叫做导入包重命名.
import (
"crypto/rand"
mrand "math/rand" // alternative name mrand avoids conflict
)
导入包重命名只影响当前的Go源文件. 其他的Go源文件如果导入了相同的包, 可以用导入包原本的名字或重命名为另一个完全不同的名字.
导入包重命名是一个有用的特性, 不仅仅是为了解决名字冲突. 如果导入的一个包名很笨重, 特别是在一些自动生成的代码中, 这时候用一个简短名称会更方便. 选择用简短名称重命名导入包时候最好统一, 比避免包名混乱. 选择另一个包名称还可以帮助避免和本地普通变量名产生冲突. 例如, 如果文件中已经有了一个名为 path 的变量, 我们可以将"path"标准包重命名为pathpkg.
每个导入声明明确指定了当前包和导入包之间的依赖关系. 如果遇到包循环导入的情况, Go的构建工具将报告错误.