Preface
这篇文章仅仅是带大家了解一下go包、管理历史、几个常见(GOPATH在下一篇详细说)的环境变量
更像科普,仅仅是了解
下一篇我会在我的视角下介绍关于GOPATH前后两个版本以及Go SDK自带的go get/go install到底区别在哪里
包
在Go语言中,“子包”指的是相对于当前包的下一级或多级的包,实际上没有严格的层级限制,只要是当前项目内的,都可以被视为子包。所以,不管是下一级还是下二级,甚至更深层级的包,都可以算作是当前包的子包。
标准库Standard Library、第三方包Third-party Packages、组织内其它包Internal Organization Packages和当前包的子包Sub-packages in Current Project 4种。
Golang包管理发展
一般编程语言都会提供依赖库管理工具,例如python的pip、node.js的npm,java的maven,rust的cargo。
go modules是"Russ Cox"(Go语言核心开发团队人员之一)推出来的,发布于Go1.11。
“依赖包”指的是项目中引用的外部库或模块。
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下。
所有项目只能使用同一个版本的依赖包。
假设你有两个项目 projectA 和 projectB,分别依赖 github.com/some/package 的不同版本。在 GOPATH 模式下,由于每个包在 GOPATH/src 下只能有一个版本,你不得不在两个项目中选择一个公共的版本。
当然,这显然不能满足需求,因为确实有的项目需要使用一个包的1.0.0版本,另一个项目需要这个包的2.0.0版本。
为了实现不同项目不同版本的管理,提出了go modules。
相关环境变量
GOROOT
就是Go SDK bin目录的地方,换句话说,你安装go的时候,注意不是编译器或IDE,是go官方下载的东西
GOVERSION
当前电脑中运行的go版本,可以使用go version直接查看电脑go版本
GO111MODULE
这个环境变量是用来控制"Go Modules"的开关的,"GO111MODULE"中的111,就是Go1.11发布时提出go module的意思。
参数:
auto:
只在项目包含了go.mod文件时启动go modules,在Go1.13版本中是默认值。
on:
无脑启动Go Modules,推荐设置,Go1.14版本以后的默认值。
off:
禁用Go Modules,一般没有使用go modules的工程使用。
我现在使用的Go版本是1.22.4,默认GO111MODULE=on。
GOPROXY
proxy 代理
可能有些小伙伴使用不了魔法,或者说单纯的想快一些,怎么办呢?设置go的代理
GOPROXY的默认值是"https://proxy.golang.org,direct"
由于某些原因国内无法正常访问该地址,所以我们通常需要配置一个可访问的地址。
目前社区使用比较多的有两个"https://goproxy.cn"和"https://goproxy.io"
设置GOPAROXY的命令如下:
go env -w GOPROXY=https://goproxy.cn,direct
GOPROXY允许设置多个代理地址,多个地址之间需使用英文逗号","分隔。最后的"direct"是一个特殊指示符,用于指示Go回源到源地址去抓取(比如"GitHub"等)。
当配置有多个代理地址时,如果第一个代理地址出错了,Go会自动尝试下一个代理地址,当遇见"direct"时触发回源,也就是回到源地址去抓取。