声明
这篇文章介绍的是如何在Ubuntu 18.04 LTS
下安装1.5及更高版本go语言编译环境的方法。由于1.5及更高版本的go语言编译器需要依赖go1.4版本,所以我们需要在安装1.4版本后,再安装更高版本。
¶前期准备
¶安装必要的工具
在命令行中输入
1 | sudo apt-get install bison ed gawk gcc libc6-dev make |
¶下载go语言封装包
前往https://golang.org/dl/
,分别下载1.4
版本及更高版本的封装包。这里以go1.12.7
为例。注意,我们是在Linux Ubuntu系统下安装go的,因此下载的封装包,文件名应该是go1.xx.xx.linux-amd64.tar.gz
。
除了从网页上下载,你也可以用wget
命令在终端直接下载:
1 | wget https://dl.google.com/go/go1.4.linux-amd64.tar.gz |
1 | wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz |
¶设置环境变量
修改/etc/profile
文件:
1 | sudo vim /etc/profile |
在结尾处添加
1 | + export GOROOT=$HOME/go |
修改完之后,执行下面的命令使配置文件生效
1 | source /etc/profile |
注意
-
Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。使用修改
/etc/profile
文件进行环境变量的编辑,是对所有用户有用。如果你修改的环境变量,只想对当前用户生效,那就对~/.bashrc
文件进行环境变量的编辑,只对当前用户有用。 -
不会使用vim的话,可以把命令行中的
vim
修改成gedit
。不过还是推荐用vim,这边涉及到的操作是:按Insert
进入插入模式,在文件结尾添加上面提到的三行代码。然后按Esc
退回到命令行模式,按:
进入Last line mode
,输入wq
保存并退出就行啦。 -
$HOME
是linux系统中预设好的环境变量,指向~
所在的文件目录,如果你不知道在你系统中$HOME
具体是哪里的话,可以在命令行中输入echo $HOME
查看:1
2swayye@swayye-ThinkPad-T470p:~$ echo $HOME
/home/swayye -
在修改的
/etc/profile
中的最后一行,也就是GOPATH
那一行代码,你可以自己指定文件目录,记得修改完/etc/profile
之后,要自己去那个目录创建对应文件夹,以我为例:1
mkdir /home/swayye/go_program
¶安装go1.4
cd
到下载go1.4.linux-amd64.tar.gz
的目录,解压压缩包:
1 | tar -zxvf go1.4.linux-amd64.tar.gz |
解压完成后,会在当前目录生成名为go
的文件夹,将文件夹移到/home/xxx
,xxx为计算机名,并将文件名改为go1.4
。
1 | mv go /home/xxx/go1.4 |
安装go1.4
编译器
1 | cd go1.4/src |
上文提到过,安装1.4以上的go编译器需要依赖1.4版本,这个在编译器领域叫bootstrapping
,中文翻译叫自举或自展,通俗地讲“用要编译的目标语言编写其编译器。
Go 1.5开始编译器和运行时用go自身编写,all.bash
编译脚本会在$GOROOT_BOOTSTRAP
环境变量中查找一个已经存在的go tool chain,实际上就是要有一个编译好的bin/go
程序。这里我们运行好1.4版本的./make.bash
后,会在/home/xxx/go1.4/bin
生成一个二进制文件,现在我们把它添加为$GOROOT_BOOTSTRAP
环境变量:
1 | export GOROOT_BOOTSTRAP=/home/swayye/go1.4 |
这样我们就可以编写更高版本的go编译器了
¶安装go1.12.7
同样地,解压1.12.7
1 | tar -zxvf go1.4.linux-amd64.tar.gz |
将解压出来的go
文件夹移到/home/xxx
1 | mv go /home/swayye |
安装1.12.7
1 | cd /home/swayye/go/src |
在完成安装后输入go env
,如显示以下内容,说明成功了
1 | swayye@swayye-ThinkPad-T470p:~$ go env |
你还可以测试一个简单的代码:
1 | package main |
运行代码:
1 | go run hello.go |
输出Hello world
,说明就没有什么问题了。