【golang】工作区与GOPATH

在学习go语言时,我们会从官网下载go语言的二进制包,然后解压并安装到某个目录,最后会配置环境变量,通过输入命令go version来验证是否安装成功。

配置了path环境后,我们还需要再配置3个环境变量,GOROOTGOPATHGOBIN

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个知识点:

  1. Go语言源码的组织方式

与许多编程语言一样,Go语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。

一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。

代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。

每个代码包都会有导入路径。代码包的导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包,具体的方式就是import该代码包的导入路径。就像这样:

"github.com/gin-gonic/gin"

在工作区中,一个代码包的导入路径实际上就是从src子目录,到该包的实际存储位置的相对路径。

所以,Go语言源码的组织方式就是以环境变量GOPATH、工作区、src目录和代码包为主线的。一般情况下,Go语言的源码文件都需要被存放在环境变量GOPATH包含的某个工作区(目录)中的src目录下的某个代码包(目录)中。

GOPATH目录约定有三个子目录

  • src:存放源代码(比如:.go .c .h .s等) 按照golang默认约定,go rungo install等命令的当前工作路径(即在此路径下执行上述命令)
  • pkg:golang编译包时生成的中间文件(比如:.a)。
  • bin:编译后生成的可执行文件(在项目内执行go install,会把执行文件安装到bin目录)(为了方便,可以把此目录加入到PATH变量中 , 如果有多个gopath,那么使用PATH变量中,如果有多个gopath,那么使用PATH变量中,如果有多个gopath,那么使用{GOPATH//?/bin:}/bin添加所有的bin目录
  1. 源码安装后的结果

源码安装以及安装后的结果文件都会放到哪里呢?我们都知道,源码文件通常会被放在某个工作区的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 中。

【golang】工作区与GOPATH_第1张图片

总之,某个工作区的src子目录下的源码文件在安装后一般会被放置到当前工作区的pkg子目录下对应的目录中,或者被直接放置到该工作区的bin子目录中。

  1. 理解构建和安装 Go 程序的过程

如果安装的是库源码文件,那么结果文件会被搬运到它所在的工作区的pkg目录下的某个子目录中。

如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的bin目录中,或者环境变量GOBIN指向的目录中。

总结

工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,
但是说它们是 Go 程序开发的核心知识并不为过。

Go 语言提供的很多工具都是在GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。

你可能感兴趣的:(golang,golang,后端)