Go语言包特性

Go语言包特性教程

Go 语言 中的 (package)是多个 Go 源码的集合,是一种高级的代码复用方案,Golang 将一些常用的 方法 都封装成了一个个系统包,这些包也被称为标准库。

Go语言包定义

语法

package packageName

参数

参数 描述
package 定义包所使用的关键字。
packageName 定义的包名。

说明

定义了一个包名为 packageName 的包。

Go语言包特性

  • 一个目录下的同级文件归属一个包,如果声明多个包,则程序报错。
  • 包名可以与其目录不同名,但最好不要这样做。
  • 包名为 main 的包为应用程序的入口包,编译源码时如果没有 main 包时,将无法编译输出可执行的文件。

Go语言包设计思想

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

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

当我们修改了一个源文件,我们必须重新编译该源文件对应的包和所有依赖该包的其他包。即使是从头构建,Go 语言编译器的编译速度也明显快于其它编译语言。Go 语言的闪电般的编译速度主要得益于三个语言特性。

显式声明

所有导入的包必须在每个文件的开头显式声明,这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。

禁止循环依赖

禁止包的环状依赖,因为没有循环依赖,包的依赖关系形成一个有向无环图,每个包可以被独立编译,而且很可能是被并发编译。

目标文件

编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。因此,在编译一个包的时候,编译器只需要读取每个直接导入包的目标文件,而不需要遍历所有依赖的的文件。