Golang多版本安装指南
Golang多版本安装指南
macOS 10.14 Mojave
Golang 1.11
您好,我正在运行 Go 1.11,但尝试安装 https://github.com/icexin/gocraft 时遇到了一些问题。作者询问我是否能在 Go 1.10 环境下运行,所以我的问题是:如何以最简便的方式(即避免从源码编译)在保留 1.11 的同时安装 1.10 版本?
我尝试过搜索,但只找到了需要从源码编译的旧解决方案。
你无需重新打开终端。只需使用以下任一命令即可,它们的作用相同:
. ~/.bash_profile
source ~/.bash_profile
更多关于Golang多版本安装指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你试过 asdf + asdf-golang 吗?
NobbZ:
你尝试过 asdf + asdf-golang 吗?
我刚刚安装了 asdf 和 asdf-golang,它们似乎安装正常。问题在于安装完成后,如何使用它们完全不清楚,而且文档似乎缺少这部分关键信息,除非我遗漏了什么显而易见的内容。
有什么线索吗?
引用 nathankerr:
1.10 版本很简单,你可以通过以下命令获取:
go get golang.org/x/build/version/go1.10.3
感谢 Nathan,我知道之前见过类似的方法。只是一时想不起具体细节了。我已经卸载了 asdf。遗憾的是相关包在 go 1.10.3 环境下仍然无法运行,但至少现在我可以轻松切换版本了。这还为我提供了在 GO111MODULE=on 和 GO111MODULE=off 环境间快速切换的便捷方式。我现在为 go1.10.3 创建了别名 goo(即 go old 的缩写)!
获取1.10版本很简单,你可以通过以下命令实现:
go get golang.org/x/build/version/go1.10.3
你将得到一个名为go1.10.3的二进制文件,通过它就可以使用go1.10.3版本。首次运行时,它会提示你执行go1.10.3 download命令来下载对应平台的二进制发行版。之后当你需要该版本时,只需使用go1.10.3替代go命令即可。
想了解更多工作原理,请阅读我的文章尝试其他Go版本。
在 Mac 系统上管理多个 Go 版本最简单的方法是将它们放在 $HOME 文件夹中。您的 Mac 系统必须在 $HOME 文件夹中有一个 .bash_profile 文件。请在其中添加以下内容:
GOROOT=${HOME}/go
GOPATH=${HOME}
PATH=$PATH:/${GOROOT}/bin:${GOPATH}/bin
export PATH GOPATH GOROOT
GOROOT 是当前 Go 编译器的路径。请根据需要调整 GOPATH。
现在,从 https://golang.org/dl/ 下载各种编译器。解压后记得在名称中添加版本号(例如 go1.11、go1.10)。然后,在 .bash_profile 的 GOROOT 变量中切换当前版本,例如:
GOROOT=${HOME}/go1.10
请注意,每次修改 .bash_profile 后必须重新打开终端才能生效。

在 macOS 10.14 Mojave 上同时管理多个 Go 版本的最简便方法是使用 Go 版本管理工具。我推荐使用 g 工具,它专门为这种场景设计。
以下是安装和使用步骤:
- 安装
g工具:
curl -sSL https://git.io/g-install | sh -s
- 安装 Go 1.10:
g install 1.10
- 切换版本:
# 切换到 Go 1.10
g set 1.10
# 切换到 Go 1.11
g set 1.11
# 验证当前版本
go version
- 或者使用版本前缀直接运行:
# 使用 Go 1.10 运行程序
g 1.10 go run main.go
# 使用 Go 1.10 构建
g 1.10 go build
g 工具会自动下载预编译的二进制版本,无需从源码编译。所有版本会安装在 ~/.go/versions/ 目录下,切换时只需修改符号链接。
验证安装的示例:
# 安装后验证
g list
# 输出类似:
# 1.10
# 1.11
# system
# 测试不同版本
g set 1.10
go version # 输出: go version go1.10 darwin/amd64
g set 1.11
go version # 输出: go version go1.11 darwin/amd64
这样你就可以在保留 Go 1.11 的同时,轻松切换到 Go 1.10 来测试那个特定的项目。

