背景
golang 的前向兼容性很好,但是介于新版本引入了旧版本所没有的特性和功能,在新版本下可行的代码往往不能被旧版本环境使用(也很合理)。 考虑到项目是在旧版本环境开发的,偶尔有需要用新版本环境编译代码的需求,因此会有切换 golang 版本的 “小众需求”。
原理
golang 在 linux 的安装和配置其实只需要做两件事:
- 将可执行文件加入
PATH
环境变量; - 指定
GOROOT
和GOPATH
。
linux 提供软链接,可以用指向不同版本 golang 目录的软链接来实现版本切换。
实现
- 安装两个版本的 golang,例如这里安装了 1.14.3 和 1.21.1 两个版本,将下载的安装包分别解压到两个文件夹中,例如这里解压到了:
~/.local/
目录下的 go14 和 go21 中; - 建立两个版本的 GOPATH,这里也放在了
~/.local/
下,分别是 gopath14 和 gopath21; - 建立软链接
ln -s ~/.local/go14 ~/.local/goroot
ln -s ~/.local/gopath14 ~/.local/gopath
- 环境变量中 GOPATH 和 GOROOT 指向这两个软链接;
- 通过脚本更新软链接指向的位置即可,
chgo 14
。
#!/bin/bash
if [[ $1 -eq 14 ]]; then
echo "Change Go version to 1.14.3"
elif [[ $1 -eq 21 ]]; then
echo "Change Go version to 1.21.1"
else
echo "ERR Go version, must be 14 or 21"
echo "useage: chgo [14/21]"
exit 1
fi
function linkGo {
rm /home/cheng/.local/gopath
rm /home/cheng/.local/goroot
ln -s /home/cheng/.local/go$1 /home/cheng/.local/goroot
ln -s /home/cheng/.local/gopath$1 /home/cheng/.local/gopath
}
linkGo $1
echo "Finished changing go version"
command backup
692 go install -v github.com/cweill/gotests/gotests@latest
695 go install -v github.com/cweill/gotests/gotests@latest
705 gopls version
706 whereis gopls
731 go version
732 go install -v github.com/cweill/gotests/gotests@v1.6.0
733 go install -x github.com/cweill/gotests/gotests@v1.6.0
734 go get -x github.com/cweill/gotests/gotests@v1.6.0
749 go verson
750 go env -w GOROOT=/home/cheng/.local/go14
751 go get -x github.com/cweill/gotests/gotests@v1.6.0
767 go get golang.org/x/tools/cmd/goimports
768 go install golang.org/x/tools/cmd/goimports@latest
769 go env -w GO111MODULE=on
770 go install golang.org/x/tools/cmd/goimports@latest
771 go get golang.org/x/tools/cmd/goimports
772 go get -x golang.org/x/tools/gopls@latest
773 go get -x golang.org/x/tools/gopls@0.11.0
774 go get -x golang.org/x/tools/gopls@0.9.5
775 go get -x golang.org/x/tools/gopls@0.8.6
776 go get -x golang.org/x/tools/gopls@0.8.4
777 go get -x golang.org/x/tools/gopls@v0.8.4
778 gopls version
779* go mod init sc-pflag