首发地址:工作区和GOPATH
核心知识
- GOPATH的意义在与代码结构分层
Go语言源码的组织方式
- 以代码包为基本组织单位
- 代码包与目录一一对应
- 目录有子目录,代码包也有子包
代码包中可以任意个.go 扩展名的源码文件,需要被声明为属于同一个代码包。
代码包的名称一般会与这些源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。
每个代码包都会有导入路径。
代码包的导入路径是其他代码在使用该包中的程序实体时需要引入的路径。
在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是import该代码包的导入路径。
import "github.com/labstack/echo"
在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。
了解源码安装后的结果
- 源码文件通常会被放在某个工作区的 src 子目录下
- 安装后如果产生了归档文件,就会放进该工作区的 pkg 子目录
- 如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。
归档文件存放的具体位置和规则
- 源码文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。
- 安装某个代码包而产生的归档文件是与这个代码包同名的。
- 放置它的相对目录就是该代码包的导入路径的直接父级。
比如,一个已存在的代码包的导入路径是
github.com/labstack/echo
- 归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。
平台相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代号组成的。
理解构建和安装 Go 程序的过程
- 构建使用命令go build,安装使用命令go install
- 构建->库源码文件->临时目录
意义在于检查和验证 - 构建->命令源码文件->源码文件所在目录
- 安装->构建->链接->搬运到指定目录
(如果安装是库源码源文件,那么就在pkg目录的某个子目录中)
(如果安装是命令源码文件,那么就在bin目录的某个子目录中,或GOBIN)
go build 命令一些可选项的用途和用法
运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。
如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。
执行命令的时候加入标记-a,可强制编译。
此时,不但目标代码包总是会被编译,它依赖的代码包也总会被编译,即使依赖的是标准库中的代码包也是如此。
确定哪些代码包被编译
- -x 查看执行了哪些操作
- -n 查看而不执行操作
- -v 查看编译的代码包的名称,也-a搭配更可口噢
设置GOPATH有什么意义?
除了环境变量 GOPATH 的值可以是一个目录的路径,也可以包含多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。
意义在于代码结构的分层。
- 源码文件放在工作区的src目录
- 归档文件放在工作区的pkg目录
- 可执行文件放在工作区的bin目录
- 归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。
知识补充
- 命令源码文件,即包含 main() 入口函数的源码文件。
- 归档文件,就是archive文件,也就是常见的.a文件,实际上就是将多个源码文件编译生成的目标文件(.o)打包归档成一份.a文件,这是程序编译后生成的静态库文件。
额外知识
Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?
三个纬度延伸总结回答:
- 总执行顺序的角度
引入的包 -> 当前包的变量常量 -> init()[多个同一包则按照顺序执行] -> main函数 - 依赖包执行顺序
被依赖的总是优先执行初始化,一个包只会被初始化一次。 a引入b,b引入c,则执行顺序c -> b -> a - 单个包执行顺序的角度
总的前提:按照包中源文件名的字典顺序来排序执行。
当前包排序后的变量常量 -> 排序后的init()
如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?
不冲突,因为按顺序找到所需要的包就不往后找了
小结
- 环境变量 GOPATH 指向的是一个或多个工作区,而每个工作区中都会有以代码包为基本组织形式的源码文件。
- GOPATH的意义在与代码结构分层
————————————————————————————————
笔记来源: