安装Go

介绍

Go 是一个开源项目, 遵守 BSD-style license的协议。本篇文档介绍如何编写Go代码,并且编译,最后运行它们。

目前有两种不同的方法可以使用Go做一些小实验。本篇文档主要介绍如何使用gc编译器和与之相关的工具(如6g,8g等)。如果您想了解 gccgo—

一个具有传统gcc风格的工具—请参考文档Setting up and using gccgo.

环境变量

Go的编译器需要使用三个必须的环境变量和一个可选的环境变量,您可以将其设置在.bashrc文件或其他的登陆脚本中:

注意变量$GOARCH和$GOOS指明的是目标环境, 而与您目前使用的环境无关,因此跨平台编译将会十分方便。

在您的.bashrc中设置这几个变量,如:

export GOROOT=$HOME/go 
export GOARCH=amd64 
export GOOS=linux 

用以下命令检查您的设置。

$ env | grep '^GO' 

跨平台

Go编译器支持两种操作系统(Linux, Mac OS X),三种目标平台。Linux和Mac平台已经可以通用,但是ARM平台上的目标平台不能 为Mac OS X(目前为止)。

在不同目标平台上,编译器所得到的结果会有一些品质差异,请注意这一点。 amd64(或 x86-64); 6g,6l,6c,6a

目前最成熟的部分。编译器拥有很好的优化器,并能够生成有效的机器码(尽管 gccgo 有时候做的更好) 386(或 x86,x86-32); 8g,8l,8c,8a

不像amd64平台那么成熟,但也拥有与之相近的性能。 arm (或 ARM);5g,5l,5c,5a

目前还有一些显而易见的缺陷,改善中。Tested against QEMU and an android phone. Except for things like low-level operating system interface code, the runtime support is the same in all ports and includes a mark-and-sweep garbage collector (a fancier one is in the works), efficient array and string slicing, support for segmented stacks, and a strong goroutine implementation.

请参阅文档gccgo document获得有关编译器和环境方面的更多细节。

取得源码

如果您没有安装Mercurial(即是说,您不能使用hg命令),执行以下命令: $ sudo easy_install mercurial 可以解决问题。(在Ubuntu乌班图系统上,您可以先试一试apt-get install python-setuptools python- dev命令)。如果没有成功,请访问Mercurial Download页面。

请确认$GOROOT路径不存在或者它是空的,然后运行以下命令以便取得源代码:

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT 

安装Go Go是用C语言编写的,为了编译它,您必须有GCC,标准C库,分析程序生成器, make和文本编辑工具ed。在Mac OS X系统上,它可以作为 Xcode的插件,而在Linux系统上,首先使用以下命令:

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

(译注:mac系统上从这一步开始)为了生成可运行的机器码,请确保$GOBIN(如果$GOBIN没有设置,那就是$HOME/bin)在你的 $PATH里面,然后执行:

$ cd $GOROOT/src 
$ ./all.bash 

如果all.bash执行的顺利,退出前将会有以下信息:

--- cd ../test 
N known bugs; 0 unexpected bugs 

其中数字N会随着每一次的发布而不同。

编写代码

以源码文件file.go为例,使用以下命令编译:

$ 6g file.go 

6g 是面向 amd64平台的编译器。它生成的文件是file.6。后缀 ‘6’ 指明目标平台是amd64。386平台和arm平台对应的后缀分别 为‘8’和‘5’。也就是说,如果您的目标平台为386,您应该使用8g, 与之对应的输出为file.8. 使用以下命令进行链接:

$ 6l file.6 

然后就可以运行了:

$ ./6.out 

以下是一个完整的示例:

$ cat >hello.go <<EOF 
package main 
import "fmt" 
func main() { 
        fmt.Printf("hello, world\N") 
} 

EOF 
$ 6g hello.go 
$ 6l hello.6 
$ ./6.out 
hello, world 
$ 

在链接命令中,我们不必指明hello.6引用的包(在这个例子里,就是包 fmt)。链接器通过文件hello.6就可以确定了。 为了编译更复杂的程序,您会需要使用Makefile。在我们的源代码包中有一些示例与说明,路径是$GOROOT/src/cmd/godoc/ Makefile和$GOROOT/src/pkg/*/Makefile. 您还可以参考更多关于GO工程的文档(链接:document) about contributing to the Go project gives more detail about the process of building and testing Go programs.

Community resources

For real-time help, there may be users or developers on #go-nuts on the Freenode IRC server.

The official mailing list for discussion of the Go language is Go Nuts.

Bugs can be reported using the Go issue tracker.

For those who wish to keep up with development, there is another mailing list, golang-checkins, that receives a message summarizing each checkin to the Go repository.