# 2.3 在 Linux 上安装 Go

如果你能够自己下载并编译 Go 的源代码的话,对你来说是非常有教育意义的，你可以根据这个页面找到安装指南和下载地址：[Download the Go distribution](http://golang.org/doc/install)。

我们接下来也会带你一步步地完成安装过程。

1. 设置 Go 环境变量

	我们在 Linux 系统下一般通过文件 `$HOME/.bashrc` 配置自定义环境变量，根据不同的发行版也可能是文件 `$HOME/.profile`，然后使用 gedit 或 vi 来编辑文件内容。

		export GOROOT=$HOME/go

	为了确保相关文件在文件系统的任何地方都能被调用，你还需要添加以下内容：

		export PATH=$PATH:$GOROOT/bin

	在开发 Go 项目时，你还需要一个环境变量来保存你的工作目录。

		export GOPATH=$HOME/Applications/Go

	`$GOPATH` 可以包含多个工作目录，取决于你的个人情况。如果你设置了多个工作目录，那么当你在之后使用 `go get`（远程包安装命令）时远程包将会被安装在第一个目录下。

	在完成这些设置后，你需要在终端输入指令 `source .bashrc` 以使这些环境变量生效。然后重启终端，输入 `go env` 和 `env` 来检查环境变量是否设置正确。

2. 安装 C 工具

	Go 的工具链是用 C 语言编写的，因此在安装 Go 之前你需要先安装相关的 C 工具。如果你使用的是 Ubuntu 的话，你可以在终端输入以下指令（ **译者注：由于网络环境的特殊性，你可能需要将每个工具分开安装** ）。

		sudo apt-get install bison ed gawk gcc libc6-dev make

	你可以在其它发行版上使用 RPM 之类的工具。

3. 获取 Go 源代码

	从 [官方页面](https://golang.org/dl/) 或 [国内镜像](http://www.golangtc.com/download) 下载 Go 的源码包到你的计算机上，然后将解压后的目录 `go` 通过命令移动到 `$GOROOT` 所指向的位置。

		wget https://storage.googleapis.com/golang/go<VERSION>.src.tar.gz
		tar -zxvf go<VERSION>.src.tar.gz
		sudo mv go $GOROOT

4. 构建 Go

	在终端使用以下指令来进行编译工作。

		cd $GOROOT/src
		./all.bash
	
	**编译注意事项**
	
	编译时如果出现如下报错：
	
	![](images/2.3.allbasherror.png?raw=true)
	
	可能是因为 `$GOROOT_BOOTSTRAP` 变量没有设置。这个目录在安装 Go 1.5 版本及之后的版本时需要设置。
	
	由于在 1.4 版本后，Go 编译器实现了自举，即通过 1.4 版本来编译安装之后版本的编译器。如果不设置该环境变量的话，会产生这样一个错误 `Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.` 。
	
	设置 `$GOROOT_BOOTSTRAP` 变量：
	    
	    export GOROOT_BOOTSTRAP=$HOME/go1.4
	
	设置完成后，下载 1.4 版本的源码到该目录：
	
	    git clone https://github.com/golang/go.git $HOME/go1.4
	    git checkout -b release-branch.go1.4 origin/release-branch.go1.4
	
	进入 1.4 的文件夹后，进行编译：
	
	    cd $HOME/go1.4/src
	    ./make.bash
	
	1.4 编译安装好之后，进入 `$GOROOT` 文件夹，真正开始编译安装 Go：
	
	    cd $HOME/go/src
	    ./all.bash
	
	在完成编译之后（通常在 1 分钟以内，如果你在 B 型树莓派上编译，一般需要 1 个小时），你会在终端看到如下信息被打印：

	![](images/2.3.allbash.png?raw=true)

	<center>图 2.3 完成编译后在终端打印的信息</center>

	**注意事项** 

	在测试 `net/http` 包时有一个测试会尝试连接 `google.com`，你可能会看到如下所示的一个无厘头的错误报告：

		‘make[2]: Leaving directory `/localusr/go/src/pkg/net’

	如果你正在使用一个带有防火墙的机器，我建议你可以在编译过程中暂时关闭防火墙，以避免不必要的错误。

	解决这个问题的另一个办法是通过设置环境变量 `$DISABLE_NET_TESTS` 来告诉构建工具忽略 `net/http` 包的相关测试：

		export DISABLE_NET_TESTS=1

	如果你完全不想运行包的测试，你可以直接运行 `./make.bash` 来进行单纯的构建过程。

5. 测试安装

	使用你最喜爱的编辑器来输入以下内容，并保存为文件名 `hello_world1.go`。

	示例 2.1 [hello_world1.go](examples/chapter_2/hello_world1.go)

	```go
	package main
	
	func main() {
		println("Hello", "world")
	}
	```

	切换相关目录到下，然后执行指令 `go run hello_world1.go`，将会打印信息：`Hello, world`。

6. 验证安装版本

	你可以通过在终端输入指令 `go version` 来打印 Go 的版本信息。

	如果你想要通过 Go 代码在运行时检测版本，可以通过以下例子实现。

	示例 2.2 [version.go](examples/chapter_2/version.go)

	```go
	package main

	import (
		"fmt"
		"runtime"
	)

	func main() {
		fmt.Printf("%s", runtime.Version())
	}
	```

	这段代码将会输出 `go1.4.2` 或类似字符串。

7. 更新版本

	你可以在 [发布历史](http://golang.org/doc/devel/release.html) 页面查看到最新的稳定版。

	当前最新的稳定版 Go 1 系列于 2012 年 3 月 28 日发布。

	Go 的源代码有以下三个分支：

		- Go release：最新稳定版，实际开发最佳选择
		- Go weekly：包含最近更新的版本，一般每周更新一次
		- Go tip：永远保持最新的版本，相当于内测版

	当你在使用不同的版本时，注意官方博客发布的信息，因为你所查阅的文档可能和你正在使用的版本不相符。

## 链接

- [目录](directory.md)
- 上一节：[Go 环境变量](02.2.md)
- 下一节：[在 Mac OS X 上安装 Go](02.4.md)
