9.1 工作空间
- src
- bin go install 结果
- pkg go get 结果
环境变量
编译器按照GOPATH设置的路径搜索目标,比当前工作空间优先级更高
GOROOT指示工具链和标准库的存放位置
GOBIN,强制代替工作空间的bin目录,作为go install目标保存路径,可避免将所有工作空间的bin路径添加到PATH环境变量中
9.2 导入包
import导入,参数是工作空间中以src为起始的绝对路径。
搜索顺序:标准库,GOPATH列表
import导入的是路径,而非包名,只不过包名通常和目录一致。在代码中引用时,则用包名
四种导入方式
- 简便方式:
import . "github.com/qyuhen/test"
, 不推荐! - 初始化:
import _ "github.com/qyuhen/test"
,仅为了让目标包的初始化函数得以执行
9.3 组织结构
包package由多个保存在同一目录下的源码文件组成,类似名字空间,是成员作用域和访问权限的边界。
统一目录下所有源码文件必须使用相同包名称。因导入时使用绝对路径,所以包必须有唯一路径
保留特殊含义的包:
- main
- all
- std, cmd
- documentation
权限
所有成员在包内均可访问,但只有首字母大写的为可导出成员,在包外可视。
初始化
包内每个源码文件都可定义一到多个初始化函数,但编译器不保证执行次序
原理是编译器自动生成一个包装函数进行调用,保证单一线程仅执行一次。
- 全局变量初始化
- 执行初始化函数
- main.main入口函数
内部包
内部包机制相当于新的访问权限控制:所有保存在internal目录下的包仅能被其父目录下的包(含所有层次的子目录)访问
9.4 依赖管理
vendor,将源码和依赖完整打包分发。
vendor比标准库优先级更高
导入vendor的第三方包,参数是以vendor为起点的绝对路径
问题:当多个vendor目录嵌套时,如何查找?(第三方包也有vendor)
- 从当前源文件所在目录开始,逐级向上构造vendor全路径,知道发现路径匹配的目标为止。匹配失败,则依旧搜索GOPATH