-1- Go 安装与运行环境
平台与架构
Go 语言开发团队开发了适用于以下操作系统的编译器:
- Linux
- FreeBSD
- Mac OS X(也称为 Darwin)
目前有 2 个版本的编译器:Go 原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix 系统下工作 。其中,gc 版本的编译器已经被移植到 Windows 平台上,并集成在主要发行版中,你也可以通过安装 MinGW 从而在 Windows 平台下使用 gcc 编译器。这两个编译器都是以单通道的形式工作。
你可以获取以下平台上的 Go 1.4 源码和二进制文件:
- Linux 2.6+:amd64、386 和 arm 架构
- Mac OS X(Snow Leopard + Lion):amd64、386 和 arm 架构
- Windows 2000+:amd64 和 386 架构
Go 环境变量
Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之前就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go
下。
这里列举几个最为重要的环境变量:
- $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是
$HOME/go
,当然,你也可以安装在别的地方。 - $GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。
- $GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。
- $GOBIN 表示编译器和链接器的安装位置,默认是
$GOROOT/bin
,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默认值。
Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性(操作系统与处理器架构)。
为了区分本地机器和目标机器,你可以使用 $GOHOSTOS
和 $GOHOSTARCH
设置本地机器的操作系统名称和编译体系结构,这两个变量只有在进行交叉编译的时候才会用到,如果你不进行显式设置,他们的值会和目标机器($GOOS
和 $GOARCH
)一样。
$GOPATH 默认采用和
$GOROOT
一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src
、pkg
和bin
,这三个目录分别用于存放源码文件、包文件和可执行文件。$GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5~7,默认为 6。
$GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数,详见第 14.1.3 节。
安装
在 Linux 上安装 Go
- 设置 Go 环境变量
我们在 Linux 系统下一般通过文件 $HOME/.bashrc
配置自定义环境变量,根据不同的发行版也可能是文件 $HOME/.profile
,然后使用 gedit 或 vi 来编辑文件内容。
1 | export GOROOT=$HOME/go |
为了确保相关文件在文件系统的任何地方都能被调用,你还需要添加以下内容:
1 | export PATH=$PATH:$GOROOT/bin |
在开发 Go 项目时,你还需要一个环境变量来保存你的工作目录。
1 | export GOPATH=$HOME/Applications/Go |
$GOPATH
可以包含多个工作目录,取决于你的个人情况。如果你设置了多个工作目录,那么当你在之后使用 go get
(远程包安装命令)时远程包将会被安装在第一个目录下。
在完成这些设置后,你需要在终端输入指令 source .bashrc
以使这些环境变量生效。然后重启终端,输入 go env
和 env
来检查环境变量是否设置正确。
- 安装 C 工具
Go 的工具链是用 C 语言编写的,因此在安装 Go 之前你需要先安装相关的 C 工具。如果你使用的是 Ubuntu 的话,你可以在终端输入以下指令( 译者注:由于网络环境的特殊性,你可能需要将每个工具分开安装 )。
1 | sudo apt-get install bison ed gawk gcc libc6-dev make |
你可以在其它发行版上使用 RPM 之类的工具。
- 获取 Go 源代码
从 官方页面 或 国内镜像 下载 Go 的源码包到你的计算机上,然后将解压后的目录 go
通过命令移动到 $GOROOT
所指向的位置。
1 | wget https://storage.googleapis.com/golang/go<VERSION>.src.tar.gz |
- 构建 Go
在终端使用以下指令来进行编译工作。
1 | cd $GOROOT/src |
- 在测试
net/http
包时有一个测试会尝试连接google.com
,你可能会看到如下所示的一个无厘头的错误报告:
1 | ‘make[2]: Leaving directory `/localusr/go/src/pkg/net’ |
如果你正在使用一个带有防火墙的机器,我建议你可以在编译过程中暂时关闭防火墙,以避免不必要的错误。
解决这个问题的另一个办法是通过设置环境变量 $DISABLE_NET_TESTS
来告诉构建工具忽略 net/http
包的相关测试:
1 | export DISABLE_NET_TESTS=1 |
如果你完全不想运行包的测试,你可以直接运行 ./make.bash
来进行单纯的构建过程。
- 测试安装
使用你最喜爱的编辑器来输入以下内容,并保存为文件名 hello_world1.go
。
示例 2.1 hello_world1.go
1 | package main |
切换相关目录到下,然后执行指令 go run hello_world1.go
,将会打印信息:Hello world
。
- 验证安装版本
你可以通过在终端输入指令 go version
来打印 Go 的版本信息。
如果你想要通过 Go 代码在运行时检测版本,可以通过以下例子实现。
示例 2.2 version.go
1 | package main |
这段代码将会输出 go1.4.2
或类似字符串。
- 更新版本
你可以在 发布历史 页面查看到最新的稳定版。
当前最新的稳定版 Go 1 系列于 2012 年 3 月 28 日发布。
Go 的源代码有以下三个分支:
1 | - Go release:最新稳定版,实际开发最佳选择 |
当你在使用不同的版本时,注意官方博客发布的信息,因为你所查阅的文档可能和你正在使用的版本不相符。
在 Mac OS X 上安装 Go
如果你想要在你的 Mac 系统上安装 Go,则必须使用 Intel 64 位处理器,Go 不支持 PowerPC 处理器。
你可以通过该页面查看有关在 PowerPC 处理器上的移植进度:codedr-go-ppc.googlecode.com/hg/。
在 Windows 上安装 Go
你可以在 下载页面 页面下载到 Windows 系统下的一键安装包。
前期的 Windows 移植工作由 Hector Chu 完成,但目前的发行版已经由 Joe Poirier 全职维护。
在完成安装包的安装之后,你只需要配置 $GOPATH
这一个环境变量就可以开始使用 Go 语言进行开发了,其它的环境变量安装包均会进行自动设置。在默认情况下,Go 将会被安装在目录 c:\go
下,但如果你在安装过程中修改安装目录,则可能需要手动修改所有的环境变量的值。
如果你想要测试安装,则可以使用指令 go run
运行 hello_world1.go。
如果发生错误 fatal error: can’t find import: fmt
则说明你的环境变量没有配置正确。
如果你想要在 Windows 下使用 cgo (调用 C 语言写的代码),则需要安装 [MinGW](http://sourceforge.net/projects/mingw/files/Automated MinGW Installer/),一般推荐安装 TDM-GCC。如果你使用的是 64 位操作系统,请务必安装 64 位版本的 MinGW。安装完成进行环境变量等相关配置即可使用。
在 Windows 下运行在虚拟机里的 Linux 系统上安装 Go:
如果你想要在 Windows 下的虚拟机里的 Linux 系统上安装 Go,你可以选择使用虚拟机软件 VMware,下载 VMware player,搜索并下载一个你喜欢的 Linux 发行版镜像,然后安装到虚拟机里,安装 Go 的流程参考第 2.3 节中的内容。
安装目录清单
你的 Go 安装目录($GOROOT
)的文件夹结构应该如下所示:
README.md, AUTHORS, CONTRIBUTORS, LICENSE
/bin
:包含可执行文件,如:编译器,Go 工具/doc
:包含示例程序,代码工具,本地文档等/lib
:包含文档模版/misc
:包含与支持 Go 编辑器有关的配置文件以及 cgo 的示例/os_arch
:包含标准库的包的对象文件(.a
)/src
:包含源代码构建脚本和标准库的包的完整源代码(Go 是一门开源语言)/src/cmd
:包含 Go 和 C 的编译器和命令行脚本
Go 运行时(runtime)
这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 11.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。
runtime 主要由 C 语言编写(自 Go 1.5 起开始自举),并且是每个 Go 包的最顶级包。你可以在目录 $GOROOT/src/runtime
中找到相关内容。
垃圾回收器 Go 拥有简单却高效的标记 - 清除回收器。它的主要思想来源于 IBM 的可复用垃圾回收器,旨在打造一个高效、低延迟的并发回收器。目前 gccgo 还没有回收器,同时适用于 gc 和 gccgo 的新回收器正在研发中。使用一门具有垃圾回收功能的编程语言不代表你可以避免内存分配所带来的问题,分配和回收内容都是消耗 CPU 资源的一种行为。
Go 的可执行文件都比相对应的源代码文件要大很多,这恰恰说明了 Go 的 runtime 嵌入到了每一个可执行文件当中。当然,在部署到数量巨大的集群时,较大的文件体积也是比较头疼的问题。但总得来说,Go 的部署工作还是要比 Java 和 Python 轻松得多。因为 Go 不需要依赖任何其它文件,它只需要一个单独的静态文件,这样你也不会像使用其它语言一样被各种不同版本的依赖文件混淆。
Go 解释器
因为 Go 具有像动态语言那样快速编译的能力,自然而然地就有人会问 Go 语言能否在 REPL(read-eval-print loop)编程环境下实现。Sebastien Binet 已经使用这种环境实现了一个 Go 解释器,你可以在这个页面找到:github.com/sbinet/igo。