01-GOPATH和工作区

版本的特性

  • Go1.5 自举,即通过Go语言编写程序来实现Go语言自身
  • Go1.7 极速垃圾回收器
  • Go1.10 对自带工具全面升级
  • 做程序依赖管理的go mod命令

环境变量

  • GOROOT:Go语言安装根目录的路径,即Go语言的安装路径
  • GOPATH:若干工作区目录的路径,用户自定义的工作空间【背后的概念最多,最重要】
  • GOBIN:Go程序生成的可执行文件的路径

设置GOPATH有什么意义? GOPATH是Go语言的工作目录,它的值是一个或多个目录的路径,每个目录都代表Go语言的一个工作区(Workspace)。

利用工作区去存放:

  1. Go语言的源码文件(source file)
  2. 安装后的归档文件(archive file,以.a为扩展名的文件)
  3. 可执行文件

事实上,Go语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着GOPATH和工作区进行的。

GOPATH背后有三个知识点:

  1. Go语言源码的组织方式是怎样的
  2. 源码安装后的结果(只有在安装后,Go语言源码才能被其他代码使用)
  3. 理解构建和安装Go程序的过程(开发问题以及查找问题的时候非常有用)

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

Go语言的源码以代码包为基本组织单位,在文件系统中,这些代码包是与目录一一对应的(目录有子目录,所以代码包有子包)。

  • 一个代码包中包含多个以.go为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包
  • 代码包的名称一般会与源码文件所在的目录同名。(如果不同名,在构建安装过程中以代码包的名字为准)。
  • 每个代码包都会有导入路径(即,其他代码在使用该包中的程序实体时,需要引入的路径)。

在实际使用程序实体之前,必须先导入其所在的代码包。具体方式就是import该代码包的导入路径:

import "github.com/labstack/echo"

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

Go语言源码的组织方式就是以环境变量GOPATH、工作区、src目录和代码包为主线的。

一般情况下,Go语言的源码文件都需要被存放在环境变量GOPATH包含的某个工作区中的src目录下的某个包中。

0.2. 源码安装后的结果

Go语言源码在安装后会产生什么样的结果?源码文件以及安装后的结果文件(归档文件以.a为扩展名)会存放在哪里?

源码文件会存放在工作区的src子目录中,安装后的归档文件会存放在工作区的pkg子目录中,如果安装后产生了可执行文件,就可能会放在该工作区的bin子目录中。

源码文件是以代码包的形式组织起来的,一个代码包对应一个目录,安装某个代码包而产生的归档文件是与这个代码包同名的。放置它的相对目录就是该代码包的导入路径的直接父级

0.2.1. 举个例子

一个已经存在的代码包的导入路径如下:

github.com/labstack/echo
// 该代码包的源码文件存在与GitHub网站的labstack组的代码仓库echo中

执行安装命令后:

go install github.com/labstack/echo

生成的归档文件的相对目录就是github.com/labstack,文件名为echo.a

上述例子中。代码包的归档文件就会被放置在当前工作区的子目录:pkg/linux_amd64/github.com/labstack

注意:在归档文件的相对目录与pkg目录之间还有一级目录,叫做平台相关目录

平台相关目录的名称是由build(构建)过程的:目标操作系统+下划线+目标计算机架构的代号三部分组成。

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

image

0.3. 构建和安装Go程序的过程

  • 构建使用go build
  • 安装使用go install

构建和安装代码包的过程中都会执行编译、打包等操作,并且操作生成的任何文件都会先被保存在某个临时的目录中。

0.3.1. 构建

  1. 如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建主要意义在于检查和验证
  2. 如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中。

0.3.2. 安装

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。

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

0.4. 总结

Go语言提供的很多工具都是在GOPATH和工作区的基础上运行的,比如,go build、go install、go get等。

上次修改: 25 November 2019