一、GOROOT

GOROOT指的Golang语言的安装路径,即Golang语言内置程序库所在的位置。通常在安装时环境变量会设置好GOROOT路径。当开发时,import标准库时并不需要额外安装,当程序运行后,也会去GOROOT路径下寻找相应程序。

# Mac配置GOROOT
# 编辑.bash_profile文件,增加如下语句:export GOROOT=/usr/local/go
> vim ~/.bash_profile 

二、GOPATH

GOPATH即存放第三方库的位置。通常开发时,会把GOPATH重新设置。

# 设置当前目录为GOPATH:选择一个目录,在目录的命令行下执行
> export GOPATH='pwd'

2.1 GOPATH目录

bin:放置编译后生成的可执行文件。
pkg:放置编译后生成的包/库的归档文件;
src:放置项目和库的源文件;

        src:用于以包(package)的形式组织并存放 Go 源文件,这里的包与 src 下的每个子目录是一一对应。例如,若一个源文件被声明属于 log 包,那么它就应当保存在 src/log 目录中。(另外注意:Go语言会把通过go get命令获取到的库源文件下载到 src 目录下对应的文件夹当中。)

        pkg:用于存放通过go install命令安装某个包后的归档文件。归档文件是指那些名称以“.a”结尾的文件。该目录与 GOROOT 目录(也就是Go语言的安装目录)下的 pkg 目录功能类似,区别在于这里的 pkg 目录专门用来存放项目代码的归档文件。编译和安装项目代码的过程一般会以代码包为单位进行,比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前项目的 pkg 目录下。

        bin:与 pkg 目录类似,在通过go install命令完成安装后,保存由 Go 命令源文件生成的可执行文件。在类 Unix 操作系统下,这个可执行文件的名称与命令源文件的文件名相同。而在 Windows 操作系统下,这个可执行文件的名称则是命令源文件的文件名加 .exe 后缀。

三、Go Modules

        Golang从1.13版本开始有Go Modules。Go Modules可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等;使用Go Modules之后我们可不用将代码放置在src下了。

# 如何开启Go Modules
方式一:> go env -w GO111MODULE=on
方式二:> export GO111MODULE=on

# GO111MODULE可以设置3个值
# on:开启
# off:关闭
# auto:根据当前目录下是否有go.mod文件来判断是否使用modules功能

# 补充:module功能默认不在GOPATH目录下查找依赖文件,所以使用modules功能时请设置好代理

        使用 Go Modules 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum:

  go.mod:会记录当前项目的所有依赖项;

  go.sum:会记录每个依赖库的版本和哈希值;

3.1 Go Modules 初始化

# 初始化路径 
> go mod init demo
# 初始化go.mod
go mod init  
# 检测依赖(更新依赖)
> go mod tidy 
# 如果有些依赖项未下载则需要下载(下载依赖文件)
> go mod download 
# 导入依赖(将依赖转移至本地的vendor文件)
> go mod vendor

// 以下不常用
# 手动修改依赖文件
> go mod edit  
# 打印依赖图
> go mod graph  
# 校验依赖
> go mod verify  
# 解释为什么需要依赖
> go mod why 

注意事项:

1)在git中需要把vendor文件夹放入白名单中,不然项目体积会很大。

2)git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件,设置忽略即可,但是 go.mod 和 go.sum 不要忽略。

3)另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可。

四、Go PROXY

        GOPROXY 是Go语言官方提供的一种通过中间代理商来为用户提供包下载服务的方式。要使用 GOPROXY 只需要设置环境变量 GOPROXY 即可。

// 阿里云镜像
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/
// 中国golang镜像
go env -w GOPROXY=https://goproxy.io
// 七牛云代理goproxy.cn
go env -w GOPROXY=https://goproxy.cn,direct

五、Go Get 

执行go get命令,在下载依赖包的同时还可以指定依赖包的版本;

运行go get -u命令会将项目中的包升级到最新的次要版本或者修订版本;

运行go get -u=patch命令会将项目中的包升级到最新的修订版本;

运行go get [包名]@[版本号]命令会下载对应包的指定版本或者将对应包升级到指定的版本。

提示:go get [包名]@[版本号]命令中版本号可以是 x.y.z 的形式,例如 go get foo@v1.2.3,也可以是 git 上的分支或 tag,例如 go get foo@master,还可以是 git 提交时的哈希值,例如 go get foo@e3702bed2。