配置多版本的 Golang 环境

ShadowC

| 本文阅读量: -

背景

golang 的前向兼容性很好,但是介于新版本引入了旧版本所没有的特性和功能,在新版本下可行的代码往往不能被旧版本环境使用(也很合理)。 考虑到项目是在旧版本环境开发的,偶尔有需要用新版本环境编译代码的需求,因此会有切换 golang 版本的 “小众需求”。

原理

golang 在 linux 的安装和配置其实只需要做两件事:

  1. 将可执行文件加入 PATH 环境变量;
  2. 指定 GOROOTGOPATH

linux 提供软链接,可以用指向不同版本 golang 目录的软链接来实现版本切换。

实现

  1. 安装两个版本的 golang,例如这里安装了 1.14.3 和 1.21.1 两个版本,将下载的安装包分别解压到两个文件夹中,例如这里解压到了:~/.local/ 目录下的 go14 和 go21 中;
  2. 建立两个版本的 GOPATH,这里也放在了 ~/.local/ 下,分别是 gopath14 和 gopath21;
  3. 建立软链接
    • ln -s ~/.local/go14 ~/.local/goroot
    • ln -s ~/.local/gopath14 ~/.local/gopath
  4. 环境变量中 GOPATH 和 GOROOT 指向这两个软链接;
  5. 通过脚本更新软链接指向的位置即可, 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