1 平台与架构

Go 语言开发团队开发了适用于以下操作系统的编译器:

  • Linux
  • FreeBSD
  • Mac OS X(也称为 Darwin)

目前有2个版本的编译器:Go 原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix 系统下工作 。其中,gc 版本的编译器已经被移植到 Windows 平台上,并集成在主要发行版中,你也可以通过安装 MinGW 从而在 Windows 平台下使用 gcc 编译器。这两个编译器都是以单通道的形式工作。

你可以获取以下平台上的 Go 1.4 源码和二进制文件:

  • Linux 6+:amd64、386 和 arm 架构
  • Mac OS X(Snow Leopard + Lion):amd64 和 386 架构
  • Windows 2000+:amd64 和 386 架构

对于非常底层的纯 Go 语言代码或者包而言,在各个操作系统平台上的可移植性是非常强的,只需要将源码拷贝到相应平台上进行编译即可,或者可以使用交叉编译来构建目标平台的应用程序(第 2 节)。但如果你打算使用 cgo 或者类似文件监控系统的软件,就需要根据实际情况进行相应地修改了。

  1. Go 原生编译器 gc:

主要基于 Ken Thompson 先前在 Plan 9 操作系统上使用的 C 工具链。

Go 语言的编译器和链接器都是使用 C 语言编写并产生本地代码,Go 不存在自我引导之类的功能。因此如果使用一个有不同指令集的编译器来构建 Go 程序,就需要针对操作系统和处理器架构(32 位操作系统或 64 位操作系统)进行区别对待。

这款编译器使用非分代、无压缩和并行的方式进行编译,它的编译速度要比 gccgo 更快,产生更好的本地代码,但编译后的程序不能够使用 gcc 进行链接。

编译器目前支持以下基于 Intel 或 AMD 处理器架构的程序构建。


图1 gc 编译器支持的处理器架构

当你第一次看到这套命名系统的时候你会觉得很奇葩,不过这些命名都是来自于 Plan 9 项目。

g = 编译器:将源代码编译为项目代码(程序文本)     l = 链接器:将项目代码链接到可执行的二进制文件(机器代码)

(相关的 C 编译器名称为 6c、8c 和 5c,相关的汇编器名称为 6a、8a 和 5a)

标记(Flags) 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的目标结果。

可用的编译器标记如下:

flags:     -I 针对包的目录搜索     -d 打印声明信息     -e 不限制错误打印的个数     -f 打印栈结构     -h 发生错误时进入恐慌(panic)状态     -o 指定输出文件名 // 详见第3.4节     -S 打印产生的汇编代码     -V 打印编译器版本 // 详见第3节     -u 禁止使用 unsafe 包中的代码     -w 打印归类后的语法解析树     -x 打印 lex tokens
go buildgo install
y.tab.{c,h}
doc.go
  1. gccgo 编译器:

一款相对于 gc 而言更加传统的编译器,使用 GCC 作为后端。GCC 是一款非常流行的 GNU 编译器,它能够构建基于众多处理器架构的应用程序。编译速度相对 gc 较慢,但产生的本地代码运行要稍微快一点。它同时也提供一些与 C 语言之间的互操作性。

从 Go 1 版本开始,gc 和 gccgo 在编译方面都有等价的功能。

  1. 文件扩展名与包(package):
.go
.c.s.a

2 Go 环境变量

c:/go
$HOME/go$GOROOT/bin

目标机器是指你打算运行你的 Go 应用程序的机器。

Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性(操作系统与处理器架构)。

$GOHOSTOS$GOHOSTARCH$GOOS$GOARCH
$GOROOTsrcpkgbin

在接下来的章节中,我们将会讨论如何在 Linux、Mac OS X 和 Windows 上安装 Go 语言。在 FreeBSD 上的安装和 Linux 非常类似。开发团队正在尝试将 Go 语言移植到其它例如 OpenBSD、DragonFlyBSD、NetBSD、Plan 9、Haiku 和 Solaris 操作系统上,你可以在这个页面找到最近的动态:Go Porting Efforts。

3 在 Linux 上安装 Go

如果你能够自己下载并编译 Go 的源代码来说是非常有教育意义的,你可以根据这个页面找到安装指南和下载地址:Download the Go distribution。

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

  1. 设置 Go 环境变量
$HOME/.bashrc$HOME/.profile
export GOROOT=$HOME/go

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

export PATH=$PATH:$GOROOT/bin

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

export GOPATH=$HOME/Applications/Go
$GOPATHgo get
source .bashrcgo envenv
  1. 安装 C 工具

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

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

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

  1. 获取 Go 源代码
go$GOROOT
wget https://storage.googleapis.com/golang/go.src.tar.gz     tar zxv go.src.tar.gz     sudo mv go $GOROOT
  1. 构建 Go

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

cd $GOROOT/src     ./all.bash

在完成编译之后(通常在 1 分钟以内,如果你在 B 型树莓派上编译,一般需要 1 个小时),你会在终端看到如下信息被打印:


图 3 完成编译后在终端打印的信息

注意事项

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

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

$DISABLE_NET_TESTSnet/http
export DISABLE_NET_TESTS=1
./make.bash
  1. 测试安装
test.go

```go package main

```

go run hello_world1.goHello, world
  1. 验证安装版本
go version

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

```go package main

```

go1.4.2
  1. 更新版本

你可以在 发布历史 页面查看到最新的稳定版。

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

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

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

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

4 在 Mac OS X 上安装 Go

如果你想要在你的 Mac 系统上安装 Go,则必须使用 Intel 64 位处理器,Go 不支持 PowerPC 处理器。

你可以通过该页面查看有关在 PowerPC 处理器上的移植进度:https://codedr-go-ppc.googlecode.com/hg/。

注意事项

在 Mac 系统下使用到的 C 工具链是 Xcode 的一部分,因此你需要通过安装 Xcode 来完成这些工具的安装。你并不需要安装完整的 Xcode,而只需要安装它的命令行工具部分。

你可以在 下载页面 页面下载到 Mac 系统下的一键安装包或源代码自行编译。

通过源代码编译安装的过程与环境变量的配置与在 Linux 系统非常相似,因此不再赘述。

5 在 Windows 上安装 Go

你可以在 下载页面 页面下载到 Windows 系统下的一键安装包。

前期的 Windows 移植工作由 Hector Chu 完成,但目前的发行版已经由 Joe Poirier 全职维护。

$GOPATHc:\go
go run
fatal error: can’t find import: fmt

如果你想要在 Windows 下使用 cgo (调用 C 语言写的代码),则需要安装 MinGW,一般推荐安装 TDM-GCC。如果你使用的是 64 位操作系统,请务必安装 64 位版本的 MinGW。安装完成进行环境变量等相关配置即可使用。

在 Windows 下运行在虚拟机里的 Linux 系统上安装 Go

如果你想要在 Windows 下的虚拟机里的 Linux 系统上安装 Go,你可以选择使用虚拟机软件 VMware,下载 VMware player,搜索并下载一个你喜欢的 Linux 发行版镜像,然后安装到虚拟机里,安装 Go 的流程参考第 3 节中的内容。

6 安装目录清单

$GOROOT

README.md, AUTHORS, CONTRIBUTORS, LICENSE

/bin/doc/lib/misc/os_arch.a/src/src/cmd

7 Go 运行时(runtime)

尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 10.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。

runtime 主要由 C 语言编写(Go 1.5 开始自举),并且是每个 Go 包的最顶级包。你可以在目录 中找到相关内容。

垃圾回收器 Go 拥有简单却高效的标记-清除回收器。它的主要思想来源于 IBM 的可复用垃圾回收器,旨在打造一个高效、低延迟的并发回收器。目前 gccgo 还没有回收器,同时适用 gc 和 gccgo 的新回收器正在研发中。使用一门具有垃圾回收功能的编程语言不代表你可以避免内存分配所带来的问题,分配和回收内容都是消耗 CPU 资源的一种行为。

Go 的可执行文件都比相对应的源代码文件要大很多,这恰恰说明了 Go 的 runtime 嵌入到了每一个可执行文件当中。当然,在部署到数量巨大的集群时,较大的文件体积也是比较头疼的问题。但总得来说,Go 的部署工作还是要比 Java 和 Python 轻松得多。因为 Go 不需要依赖任何其它文件,它只需要一个单独的静态文件,这样你也不会像使用其它语言一样在各种不同版本的依赖文件之间混淆。

8 Go 解释器

因为 Go 具有像动态语言那样快速编译的能力,自然而然地就有人会问 Go 语言能否在 REPL(read-eval-print loop)编程环境下实现。Sebastien Binet 已经使用这种环境实现了一个 Go 解释器,你可以在这个页面找到:https://github.com/sbinet/igo。