01
概念
在 Go 语言中,包由一个或多个保存在同一目录的源码文件组成,包名与目录名无关,但是通常大家习惯包名和目录名保持一致。同一目录的源码文件必须使用相同的包名。
包的用途类似于其他语言的命名空间,可以限制成员的作用域和访问权限。无论是否在同一源码文件的成员,只要在同一个包内,成员均可被访问。但是只有首字母大写的成员为导出成员,可以在包外访问。
除了基于首字母大小写控制访问权限,在 Go 语言中,还可以使用内部包机制来控制访问权限,内部包源码文件存放于包目录的子目录,内部包源码文件的导出成员仅能被其父目录下的包访问。
02
包声明
在 Go 语言中,每一个源码文件开头都必须使用关键字 package 进行包声明(定义包名)。主要目的是限制包内成员的作用域和访问权限,也是当前包被其他包导入时的标识符。包名是导入路径的最后一段,所以不同导入路径的包名可以相同。
03
包导入
- 导入路径
Go 语言中的每一个包都是通过唯一的字符串进行标识,称为导入路径。 - 导入声明
在 Go 源码文件中,可以在 package 包声明后面导入一个或多个包,每一个导入的包可以单独使用关键字 import 指定一个导入路径,也可以使用圆括号括起来一组导入路径,使用关键字 import 一次导入多个包,通常大家更喜欢使用第二种方式。
如果在同一个包中导入两个相同包名的包,需要至少为其中一个包起别名来避免冲突,别名仅对当前源码文件有效。有时别名也不止用于避免包名冲突,对于一些较长的包名,为了方便使用,通常也会定义一个短别名。
- 空白导入
如果导入的包,在源码中没有使用该包名,编译时就会产生错误。但在实际项目开发中,有时我们仅需要使用一个包中的变量和执行它的 init 函数,为了避免此类情况导致的编译错误,我们可以在导入路径前面使用空白标识符 “_” 。
04
包创建
在创建一个包时,尽量使用简短的包名,但是要尽可能保持包名的可读性和无歧义,如果需要用到与 go 关键字同名的包名,一般采用其复数形式。