场景

工作需要,一般使用的是相对较低的go版本,且较长时间内不会轻易变更;自己尝鲜或参与某个开源项目,又会使用另外的go版本。在不同项目间切换工作,通常需要切换到对应的go版本(虽然go目前是向下兼容的,高版本可以正确编译低版本,但开发人员即便熟知不同版本间的差异,也不能百分百保证不使用到高版本的特性)。

解决方案

网上也有很多方案,尝试后摸索出了比较符合自己风格和习惯的方案。

  1. 创建一个存放go不同版本的目录,用于将不同版本下载到该目录统一管理,并以版本号命名
1
mkdir $HOME/gosdk
  1. 编写下载脚本download_go.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

if test "${1}" == ""; then
  echo '请传入正确的版本号,如:'${0}' 1.21.1'
else
  # 统一管理目录
  gosdk=$HOME/gosdk
  # 下载
  gopkg=go${1}.linux-amd64.tar.gz
  if ! test -e ${gopkg}; then
    wget -c https://dl.google.com/go/${gopkg}
  fi
  # 删除可能冲突的文件
  rm -rf ${gosdk}/go
  rm -rf ${gosdk}/go${1}
  # 解压
  tar -C ${gosdk}/ -xzf ${gopkg}
  # 重命名
  mv ${gosdk}/go ${gosdk}/go${1}
  # 删除安装包
  rm ${gopkg}
  # 配置环境变量
  go env -w GOPROXY=https://goproxy.cn,direct
  go env -w GO111MODULE=on
fi
  1. 编写切换脚本switch_go.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

if test "${1}" == ""; then
  echo '请传入正确的版本号,如:'${0}' 1.21.1'
else
  # 统一管理目录
  gosdk=$HOME/gosdk
  # 创建符号链接
  ln -sfn ${gosdk}/go${1} $HOME/.local/go
fi
  1. 将符号链接的路径加入搜索路径:
1
echo -e "\n# golang \nexport PATH=\$PATH:\$HOME/.local/go/bin:\$HOME/go/bin" >> ~/.bashrc
  1. download_go.shswitch_go.sh放入$HOME/.local/bin之类已存在于搜索路径的目录下,或将其所在路径加入搜索路径

  2. 使用download_go.sh下载所需版本的go,在需要切换时使用switch_go.sh进行切换