Go笔记-Chap9 包结构

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

权限

所有成员在包内均可访问,但只有首字母大写的为可导出成员,在包外可视。

初始化

包内每个源码文件都可定义一到多个初始化函数,但编译器不保证执行次序
原理是编译器自动生成一个包装函数进行调用,保证单一线程仅执行一次。

  1. 全局变量初始化
  2. 执行初始化函数
  3. main.main入口函数

内部包

内部包机制相当于新的访问权限控制:所有保存在internal目录下的包仅能被其父目录下的包(含所有层次的子目录)访问

9.4 依赖管理

vendor,将源码和依赖完整打包分发。

vendor比标准库优先级更高
导入vendor的第三方包,参数是以vendor为起点的绝对路径

问题:当多个vendor目录嵌套时,如何查找?(第三方包也有vendor)

  • 从当前源文件所在目录开始,逐级向上构造vendor全路径,知道发现路径匹配的目标为止。匹配失败,则依旧搜索GOPATH

你可能感兴趣的:(Go笔记-Chap9 包结构)