特性:1、包名一般是小写,用一个简短且有意义的名称;2、包名一般要和所在的目录同名,也可不同名,包名中不能包含“-”等特殊符号;3、包一般使用域名作为目录名称,这样能保证包名的唯一性;4、包名为main的包为应用程序的入口包,编译源码时如果没有main包时,将无法编译输出可执行的文件;5、一个目录下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个目录下。

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方案。Go语言中为我们提供了很多内置包,如 fmt、os、io 等。

任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName 语句,通过该语句声明自己所在的包。

包的基本概念

Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。

GOPATH/src/a/b/package cpackage a/b/cimport "a/b/c"

Go语言包特性

GOPATH/src/github.com/userName/projectName

Go语言包设计思想

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

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

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

显式声明

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

禁止循环依赖

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

目标文件

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