August 2021
Beginner to intermediate
450 pages
6h 1m
Chinese
任何包管理系统的目的都是通过对关联的特性进行分类,组织成便于理解和修改的单元,使其与程序的其他包保持独立,从而有助于设计和维护大型的程序。模块化允许包在不同的项目中共享、复用,在组织中发布,或者在全世界范围内使用。
每个包定义了一个不同的命名空间作为它的标识符。每个名字关联一个具体的包,它让我们在为类型、函数等选取短小而且清晰的名字的同时,不与程序的其他部分冲突。
包通过控制名字是否导出使其对包外可见来提供封装能力。限制包成员的可见性,从而隐藏API后面的辅助函数和类型,允许包的维护者修改包的实现而不影响包外部的代码。限制变量的可见性也可以隐藏变量,这样使用者仅可以通过导出函数来对其访问和更新,他们可以保留自己的不变量以及在并发程序中实现互斥的访问。
当我们修改一个文件时,我们必须重新编译文件所在的包和所有潜在依赖它的包。众所周知,Go程序的编译比其他语言要快,即便从零开始编译也如此。这里有三个主要原因。第一,所有的导入都必须在每一个源文件的开头进行显式列出,这样编译器在确定依赖性的时候就不需要读取和处理整个文件;第二,包的依赖性形成有向无环图,因为没有环,所以包可以独立甚至并行编译。第三,Go包编译输出的目标文件不仅记录它自己的导出信息,还记录它所依赖包的导出信息。当编译一个包时,编译器必须从每一个导入中读取一个目标文件,但是不会超出这些文件。