GOPATH

表示go的工作目录,这个目录指定了需要从哪个地方寻找GO的包、可执行程序等,这个目录可以是多个目录表示,

go编译或者运行时会从这个环境变量中去对应查找,可能还不够清晰,工作目录或者如官方文档中说的workspace,

可以这么理解为GO源码目录,在这个目录进行编译、链接最后生成所需要的库、可执行文件

GOROOT

表示的是go语言编译、工具、标准库等的安装路径。

在Linux下设置GOROOT目录:

GOPROXY,简单来说就是一个代理,让我们更方便的下载哪些由于墙的原因而导致无法下载的第三方包,

比如http://golang.org/x/下的包,虽然也有各种方法解决,但是,如果是你在拉取第三方包的时候,而这个包又依赖于http://golang.org/x/下的包,

你本地又恰恰没有,当然不嫌麻烦的话,也可以先拉取http://golang.org/x/下的包,再拉取第三方包。

官网是这么说的 A Global Proxy for Go Modules go包的全球代理。

http://proxy.golang.org 在中国无法访问,故而建议使用 http://goproxy.cn 作为替代。

我个人本地环境配置参数


其实GOPROXY中的 “direct” 为特殊指示符,

用于指示 Go 回源到模块版本的源地址去抓取 (比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,

遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision...” 的错误。

GO111MODULE

export GO111MODULE=on # 开启GoModule特性

或者在环境信息文件/etc/profile的最后面添加上一行

GO111MODULE解释, 当为on时则使用Go Modules,go 会忽略 $GOPATH和 vendor文件夹,只根据go.mod下载依赖。

当为 off时则不适用新特性 Go Modules支持,它会查找 vendor目录和 $GOPATH来查找依赖关系,也就是继续使用“GOPATH模式”。

当为 auto时或未设置时则根据当前项目目录下是否存在 go.mod文件或 $GOPATH/src之外并且其本身包含go.mod文件时才会使用新特性 Go Modules模式,

并且auto为 GO111MODULE的默认值。

go modules

golang官方建议是一个项目一个GOPATH,但是鉴于很多人都不这么做(我也不这么做,因为麻烦),

于是在go1.11的时候推出了这个go modules来解决依赖管理的问题。

使用:

生成 go.mod 文件

加载 pakage 到 GOPATH\pkg\mod 下

配合go get使用(版本筛选):

go get 自动下载package包到 GOPATH\pkg\mod 目录下,并更新go.mod文件

go get package[@version]来安装指定版本的package,默认go get package@latest

version可以是vx.y.z这种形式或者直接使用commit的checksum,也可以是master或者latest

当version是master时,不管package有没有打tag,都会选择master分支的最新commit

可以在version前使用>,>=,<,<=,表示选取的版本不得超过/低于version,在这个范围内的符合latest条件的版本

当想要修改package的版本时,只需要go get package@指定的version即可

GOPRIVATE

go get通过代理服务拉取私有仓库(企业内部module或托管站点上的private库),而代理服务不可能访问到私有仓库,会出现了404错误

go1.13版本提供了一个方便的解决方案:GOPRIVATE环境变量。

私有库访问可以通过命令git config ...的方式来配置

我个人是直接使用 https 即可强制go get针对http://github.com与http://gitlab.com使用ssh而非https。

GONOPROXY 和 GONOSUMDB

GONOPROXY和GONOSUMDB均为none,意味着所有module,不管是公共的还是私有的,

都要经过proxy下载,经过sumdb验证

GONOPROXY="《*.xxx,com》"

GONOSUMDB="《*.xxx,com》"

《*.xxx,com》网站不走代理拉取第三方包