为什么Go不需要虚拟环境

参考:You don’t need virtualenv in Go

虚拟环境的使用场景:

  1. 运行、部署应用时
  2. 开发时

运行时

Python等脚本语言在运行时需要一个完整的Python环境,不仅需要要求第三方包的版本,Python本身和标准库的版本大多数时候也需要限制。使用不同的Python运行环境可能会导致应用无法正常运行。

但是Go是一个静态编译的语言,只要编译成二进制的版本,并不需要依赖什么外部环境,甚至不要求运行的机器上安装Go。另外,Go提供了很好的交叉编译环境,很容易在一台计算机上编译出多个可以运行在不同架构计算机上的二进制版本。

开发时

在开发中,一台开发计算机上可能会同时存在多个项目,而每个项目对开发环境的需求有所差别。这里的差别包含两方面:

  1. 对不同的第三方依赖的版本有差别,因此需要某一个第三方包的多个版本共存于系统中。
  2. 对不同的语言运行环境(例如标准库)有不同的版本依赖。

对于Python来说,如果没有虚拟环境,以上两个需求都不能解决。pip只允许每个第三方库安装一个版本,而且Python本身的版本当然也只有一个。对于Nodejs的npm,第一个问题可以解决,Nodejs会在项目下安装所有依赖,也就是臭名昭著的node_modules。

在Go中,1.16版本引入的go mod很好地解决了第一个问题。不同版本的第三方包都被安装在GOPATH下,可以共存,而每个项目的go.mod文件中都指定了具体依赖的版本。

对于第二个问题,go支持在一台计算机上安装多个go版本。

安装和使用多个go版本

具体方法是:

  1. 先安装当前最新的go版本。参考官网的安装指南

安装后,环境变量中会被添加一个最新的go所在的PATH,使go命令可以被shell调用。GOROOT变量本身并不会(也不需要)被设置到系统的环境变量中,它只需要存在于go env中,用来告诉go tool标准库的位置。如果手动在环境变量中设置GOROOT,多个go版本反而都会使用这个变量,会造成go tool的版本和go标准库版本不匹配的问题。

  1. 通过go命令安装go的其他版本,参考指南,运行命令即可:go install golang.org/dl/go1.10.7@latest && go1.10.7 download
  2. 通过go1.10.7 version && go1.10.7 env GOROOT确认这个go的版本和GOROOT位置。
  3. 如果需要卸载,只需要手动删除这个GOROOT以及go1.10.7命令文件即可。

在Goland中,可以通过go settings配置使用不同的go版本。

  1. 首先打开go settings,添加一个go版本。

    image-20240713094111487

  2. 选择local,然后选择刚才安装的新的GOROOT的位置。image-20240713094232168

  3. OK后这里会自动切换到新添加的版本。选择了一个版本后,再打开terminal,可以发现Goland自动帮我们设置好了环境变量,直接go(不需要带后面一堆版本号)也可以使用go settings中指定的版本了。