在学习go
语言时,我们会从官网下载go
语言的二进制包,然后解压并安装到某个目录,最后会配置环境变量,通过输入命令go version
来验证是否安装成功。
配置了path
环境后,我们还需要再配置3个环境变量,GOROOT
、GOPATH
和GOBIN
。
GOROOT
:Go语言安装根目录的路径,也就是GO语言的安装路径。
GOPATH
:若干工作区目录的路径。是我们自己定义的工作空间。
GOBIN
:GO程序生成的可执行文件(executable file)的路径。
设置GOPATH有什么意义呢?
典型回答:
你可以把GOPATH简单理解成Go语言的工作目录,它的值是一个目录的路径,也可以是多个目录的路径,每个目录都代表Go语言的一个工作区(workspace)
。
我们需要利用这些工作区,去放置Go语言的源码文件(source file)
,以及安装(install)
后的归档文件(archive file
,也就是以".a"为扩展名的文件)和可执行文件(executable file)
。
事实上,由于Go语言项目在生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着GOPATH和工作区进行的。所以, 它身后至少还有这3个知识点:
- Go语言源码的组织方式
与许多编程语言一样,Go语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。
一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。
代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。
每个代码包都会有导入路径。代码包的导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包,具体的方式就是import
该代码包的导入路径。就像这样:
"github.com/gin-gonic/gin"
在工作区中,一个代码包的导入路径实际上就是从src子目录,到该包的实际存储位置的相对路径。
所以,Go语言源码的组织方式就是以环境变量GOPATH、工作区、src目录和代码包为主线的。一般情况下,Go语言的源码文件都需要被存放在环境变量GOPATH包含的某个工作区(目录)中的src目录下的某个代码包(目录)中。
GOPATH
目录约定有三个子目录
- src:存放源代码(比如:.go .c .h .s等) 按照
golang
默认约定,go run
,go install
等命令的当前工作路径(即在此路径下执行上述命令) - pkg:
golang
编译包时生成的中间文件(比如:.a)。 - bin:编译后生成的可执行文件(在项目内执行
go install
,会把执行文件安装到bin目录
)(为了方便,可以把此目录加入到PATH
变量中 , 如果有多个gopath
,那么使用PATH
变量中,如果有多个gopath
,那么使用PATH
变量中,如果有多个gopath
,那么使用{GOPATH//?/bin:}/bin
添加所有的bin
目录
- 源码安装后的结果
源码安装以及安装后的结果文件都会放到哪里呢?我们都知道,源码文件通常会被放在某个工作区的src子目录下。
那么安装后如果产生了归档文件(以“.a”为扩展名的文件),就会放进该工作区的pkg子目录;如果产生了可执行文件,就可能放进该工作区的bin子目录。
归档文件存放的具体位置和规则:
源码文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。安装某个代码包而
产生的归档文件是与这个代码包同名的。
放置它的相对目录就是该代码包的导入路径的直接父级。比如,一个已存在的代码包的导入
路径是
github.com/labstack/echo,
执行命令:
go install github.com/labstack/echo
生成的归档文件的相对目录就是 github.com/labstack, 文件名为 echo.a。
顺便说一下,上面这个代码包导入路径还有另外一层含义,那就是:该代码包的源码文件存
在于 GitHub 网站的 labstack 组的代码仓库 echo 中。
再说回来,归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。平台
相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代
号组成的。
比如,构建某个代码包时的目标操作系统是 Linux,目标计算架构是 64 位的,那么对应的
平台相关目录就是 linux_amd64。
因此,上述代码包的归档文件就会被放置在当前工作区的子目录
pkg/linux_amd64/github.com/labstack 中。
总之,某个工作区的src子目录下的源码文件在安装后一般会被放置到当前工作区的pkg子目录下对应的目录中,或者被直接放置到该工作区的bin子目录中。
- 理解构建和安装 Go 程序的过程
如果安装的是库源码文件,那么结果文件会被搬运到它所在的工作区的pkg目录下的某个子目录中。
如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的bin目录中,或者环境变量GOBIN指向的目录中。
总结
工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,
但是说它们是 Go 程序开发的核心知识并不为过。
Go 语言提供的很多工具都是在GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。