10.3. 包声明
在每个Go源文件的开头都必须有包声明. 主要的目的是确定当前包被其他包导入时默认的标识符(称为包名).
例如, math/rand 包的每个文件的开头都是 package rand
包声明, 所有 当你导入这个包, 你可以用 rand.Int, rand.Float64 的方式访问包的成员.
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int())
}
通常来说, 默认的包名就是包导入路径名的最后一段, 因此即使两个包的导入路径不同, 它们依然可能有一个相同的包名. 例如, math/rand 和 crypto/rand 包的名字都是 rand. 稍后我们将看到如何同时导入两个包名字相同的包.
关于默认包名一般采用导入路径名的最后一段的约定有三种例外情况. 第一个例外是包对应一个可执行程序, 也就是 main 包, 这时候main包本身的导入路径是无关紧要的. 这是给 go build (§10.7.3) 构建命令一个信息, 必须调用连接器生成一个可执行程序.
第二个例外是包所在的目录中可能有一些文件名是以test.go为后缀的Go源文件(译注: 前面必须有其他的字符, 因为 前缀的源文件可能是被忽略的.), 并且这些源文件声明的包名也是以_test为后缀名的. 这种目录可以定义两个包: 一个普通包, 加一个外部测试包. 以 _test 为后缀包名的外部测试包由 go test 命令独立编译, 两个包是相互独立的. 外部测试包一般用来避免测试代码中的导入包的循环导入依赖, 具体细节我们将在 11.2.4 中介绍.
第三个例外是一些依赖版本号的管理工具会在导入路径后追加版本号信息, 例如 "gopkg.in/yaml.v2". 这种情况下包的名字并不包含版本号后缀, 只是yaml.