文章目录
- 1.下载与安装
- 2.GOROOT
- 3.Go 的包管理
- 3.1 GOPATH 模式
- 3.2 Go Modules 模式
- 4.GOPATH
- 5.GO111MODULE
- 6.GOPROXY
- 7.GOSUMDB
- 8.GONOPROXY/GONOSUMDB/GOPRIVATE
- 9.GOMODCACHE
- 10.GOCACHE
- 11.GOENV
- 12.GOBIN
- 13.参考资料
1.下载与安装
参考文章:Golang V1.19.1 安装配置 (windows)
Go 官网下载地址:https://golang.google.cn/dl/
下载完成后会得到 go1.20.3.windows-amd64.msi 这个文件,直接双击运行,进入如下界面,点击 Next。
默认勾选了 “I accept the terms in the License Agreement”,点击 Next。
Go 默认安装在 C 盘,可以更改一下 Go 的安装路径,然后点击 Next。
注意:这里设置的安装路径就是后续 GOROOT
的值。
然后点击 Install,等待安装完成。
最后点击 Finish。
2.GOROOT
GOROOT 就是 Go 语言的安装目录,在绝大多数情况下都不需要修改 GOROOT。
以我的电脑为例,GOROOT 的值为 D:\software\golang
。
Go 的文件目录结构如下:
在安装 Go1.20.3 的时候,默认会自动把 GOROOT 下的 bin 目录添加到系统环境变量 PATH 中。
以我的电脑为例,已经自动把 D:\software\golang\bin
添加到系统环境变量 PATH 中了。
因此,win + R 输入 cmd 打开命令行,在任意位置下输入 go version
都能执行成功。
在命令行中输入 go env
来查看所有 Go 环境变量的当前值:
3.Go 的包管理
参考文章:
- 一文搞懂 Go Modules 前世今生及入门使用
- 简单聊聊 GOPATH 与 Go Modules
- go包管理速通,一篇文章就够了,再也不用担心因为不会导包被辞退
- 10分钟带你了解Go依赖管理常见模式(一)
3.1 GOPATH 模式
在 GOPATH 模式下,要求将所有工程代码放在 GOPATH/src
目录下。在工程经过 go build xxx、go install xxx 或 go get xxx 等指令后,会将拉取的第三方 xxx 依赖包放在 GOPATH/src
目录下,产生的二进制可执行文件放在 GOPATH/bin
目录下,生成的中间缓存文件会被保存在 GOPATH/pkg
目录下。
GOPATH 模式下没有版本控制的概念,在执行 go get 的时候,获取的永远是最新的依赖包,并下载到 GOPATH/src
目录下,如果你有两个工程依赖一个包的 v1 和 v2 版本,则会发生冲突,因为 GOPATH 模式下两个工程内依赖的导入路径都是一样的,因此两个工程获取的都是 v2 版本。
GOPATH 模式已经不推荐使用了,任何 Gopher 应该从此刻就投入 Go Modules 的怀抱。
3.2 Go Modules 模式
Go Modules 发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使用。
在 Go Modules 模式下,所有依赖的包存放在 GOPATH/pkg/mod
目录下,所有第三方二进制可执行文件放在 GOPATH/bin
目录下,且工程项目可以放在 GOPATH/src
路径之外,但要求项目中需要有 go.mod 文件(该文件可以通过 go mod init 命令初始化得到)。
在有了 Go Modules 之后,GOPATH 和 Go Modules 就分别负责不同的职责,共同为 Golang 项目服务:
- GOPATH 用来存放我们从网上拉取的第三方依赖包。
- Go Modules 用来存放我们自己的 Golang 项目文件,当自己的项目需要依赖第三方的包的时候,我们通过 Go Modules 目录下的一个 go.mod 文件来引用
GOPATH/pkg/mod
文件夹下的第三方依赖即可。
这样一来,既解决了原来只能局限在 GOPATH/src
下进行编程的问题,也解决了第三方依赖包难以管理和重复依赖占用磁盘空间的问题。总而言之,在引入 Go Modules 之后,我们不会直接在 GOPATH 目录下进行编程,而是把 GOPATH 作为一个第三方依赖包的仓库,我们真正的工作空间在 Go Modules 目录下。
4.GOPATH
至此,
GOPATH 就是之后项目下载依赖包的存放路径。Go 语言目前都是使用 Go Modules 管理依赖,在使用 Go Modules 时,Go 会把下载的依赖包存储在 GOPATH\pkg\mod
中。
其实,在安装 Go1.20.3 时已经自动配置好 GOPATH 了,但是默认情况下 GOPATH 在 C 盘,所以,之后下载的外部依赖包也就存放在 C 盘。如果怕之后安装的依赖包太多占用 C 盘空间的话,我们可以更改 GOPATH 到其他位置。
将 GOPATH 变量的值 %USERPROFILE%\go
修改为自己想要的目录。
然后再把用户环境变量 PATH 中的值 %USERPROFILE%\go\bin
修改为 GOPATH 下的 bin 目录。
5.GO111MODULE
GO111MODULE 是 Go Modules 功能的开关,GO111MODULE 有三个值:
- GO111MODULE=off,go 命令行将不会支持 modules 功能,寻找依赖包的方式将会沿用旧版本的通过 vendor 目录或者 GOPATH 模式来查找。
- GO111MODULE=on,go 命令行会使用 modules 功能,而一点也不会去 GOPATH 目录下查找。
- GO111MODULE=auto,go 命令行将会根据当前目录来决定是否启用 modules 功能。下面两种情形将启用 modules 功能:
- 当前目录在 GOPATH\src 之外且该目录包含 go.mod 文件。
- 当前文件在包含 go.mod 文件的目录下面。
开启 Go Modules 功能的命令如下:
go env -w GO111MODULE=on
6.GOPROXY
GOPROXY 主要用于设置 Go 模块代理,其作用是使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。
GOPROXY 的值是一个以英文逗号 ,
分割的 Go 模块代理列表,允许设置多个模块代理。假设你不想使用,也可以将其设置为 off
,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。
GOPROXY 的默认值是 https://proxy.golang.org,direct
,在国内无法访问。
因此,这里推荐使用七牛云的代理:https://goproxy.cn/
设置七牛云代理的命令如下:
go env -w GOPROXY=https://goproxy.cn,direct
在上面设置的值中,我们可以发现值列表中有 “direct” 标识,它又有什么作用呢?
实际上 “direct” 是一个特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),场景如下:当值列表中上一个 Go 模块代理返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,也就是回到源地址去抓取,而遇见 EOF 时终止并抛出类似 “invalid version: unknown revision…” 的错误。
7.GOSUMDB
GOSUMDB 的值是一个 Go checksum database,用于在拉取模块版本时(无论是从源站拉取还是通过 Go module proxy 拉取)保证拉取到的模块版本数据未经过篡改,若发现不一致,也就是可能存在篡改,将会立即中止。
GOSUMDB 的默认值为 sum.golang.org
,在国内无法访问,但是 GOSUMDB 可以被 Go 模块代理所代理。因此,我们可以通过设置 GOPROXY 来解决,而先前我们所设置的模块代理 https://goproxy.cn
就能支持代理 sum.golang.org
,所以这一个问题在设置 GOPROXY 后,你可以不需要过度关心。
也可以将 GOSUMDB 设置为 off
,也就是禁止 Go 在后续操作中校验模块版本。
8.GONOPROXY/GONOSUMDB/GOPRIVATE
这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 Git 仓库,又或是 Github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。
更细致来讲,就是依赖了由 GOPROXY 指定的 Go 模块代理或由 GOSUMDB 指定 Go checksum database 都无法访问到的模块时的场景。
而一般建议直接设置 GOPRIVATE,它的值将作为 GONOPROXY 和 GONOSUMDB 的默认值,所以建议的最佳姿势是直接使用 GOPRIVATE。
并且它们的值都是一个以英文逗号 ,
分割的模块路径前缀,也就是可以设置多个,例如:
go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote"
设置后,前缀为 git.example.com 和 github.com/eddycjy/mquote 的模块都会被认为是私有模块。
如果不想每次都重新设置,我们也可以利用通配符,例如:
go env -w GOPRIVATE="*.example.com"
这样设置的话,所有模块路径为 example.com 的子域名(例如:git.example.com)都将不经过 Go module proxy 和 Go checksum database,需要注意的是不包括 example.com 本身。
9.GOMODCACHE
GOMODCACHE 就是存储 Go 下载的外部依赖模块文件的目录,默认值为 GOPATH\pkg\mod
。
以我的电脑为例,GOMODCACHE 的值为 D:\software\gopath\pkg\mod
。
因此,我们只需要更改 GOPATH 的值即可,GOMODCACHE 的值会自动做出相应的变动。
10.GOCACHE
GOCACHE 目录用来存放 Go 项目在构建过程中产生的缓存,默认值为 C:\Users\%UserName%\AppData\Local\go-build
。
以我的电脑为例,GOCACHE 的值为 C:\Users\Cai\AppData\Local\go-build
。
11.GOENV
GOENV 目录用来存放 Go 环境变量的值的配置文件,默认值为 C:\Users\%UserName%\AppData\Roaming\go\env
,此值一般不需要更改,并且也不能通过 go env 的方式来更改此变量值。
以我的电脑为例,GOENV 的值为 C:\Users\Cai\AppData\Roaming\go\env
。
我们可以来到此目录下,发现有一个 env 文件,打开就可以看到:文件的内容就是我们之前自定义过的 Go 环境变量的值。
12.GOBIN
GOBIN 目录用来存放程序生成的可执行文件。可以设置它,也可以不设置,默认为空,保持默认即可。
在使用 Go Modules 时,Go 会把 go install 的可执行文件结果放在 GOPATH\bin
中。在前面的步骤中,我们已经把 GOPATH\bin
这个目录添加到用户环境变量 PATH 中了,这样在全局任何地方都能找到这个目录。
13.参考资料
Go env环境变量配置
GO111MODULE的设置与查看
Go — build、run 和 install 命令
亲测GO环境搭建,理解go build、go install、go get
go run、build、install、get的原理和区别
go mod使用
简单聊聊 GOPATH 与 Go Modules
GoModules模式基础环境说明
Go 语言中 GoPath 模式与 GoModules 模式介绍
go env环境变量详解(一)
go env环境变量详解(二)