10.1. 简介

任何包系统设计的目的都是为了使大型程序的设计和维护, 通过将一组相关的特性放进一个独立的单元以便于理解和更新, 同时保持和程序中其他单元的相对独立性. 这种模块化的特性允许每个包可以被其他的不同项目共享和重用, 在项目内甚至全球统一的分发.

每个包定义了一个不同的名称空间用于它内部的每个标识符. 每个名称关联到一个特定的包, 我们最好给类型, 函数等选择简短清晰的名字, 这样可以避免在我们使用它们的时候减少和其他部分名字的冲突.

包还通过控制包内名字的可见性和是否导出来实现封装特性. 通过限制包成员的可见性并隐藏包API的具体实现, 将允许包的维护者在不影响外部包用户的前提下调整包的内部实现. 通过限制包内变量的可见性, 还可以控制用户通过某些特定函数来访问和更新内部变量, 这样可以保证内部变量的一致性和并发时的互斥约束.

当我们修改了一个文件, 我们必须重新编译改文件对应的包和所以依赖该包的其他包.即使是从头构建, Go的编译器也明显快于其他编译语言. Go的编译速度主要得益于三个特性. 第一点, 所有导入的包必须在每个文件的开头显式声明, 这样的话编译器就没有必要读取分析整个文件来判断包的依赖关系. 第二点, 包的依赖关系形成一个有向无环图, 因为没有循环依赖, 每个包可以被独立编译, 很可能是并发编译. 第三点, 编译后包的目标文件不仅仅记录包本身的导出信息, 同时还记录了它的依赖关系. 因此, 在编译一个包的时候, 编译器只需要读取每个直接导入包的目标文件, 而不是要遍历所有依赖的的文件(译注: 很多可能是间接依赖).