本文档是由 Go语言中文小组 根据 golang.org 的文档翻译,最新的翻译文档可以从http://code.google.com/p/golang-china/获取。
译者列表(如果对署名有争议请联系:chaishushan@gmail.com):
标题 | 翻译者 | 校验者 | |
---|---|---|---|
Install Install Go(安装Go环境) | ChaiShushan | ||
Go Tutorial(Go语言入门教程) | BianJiang && ChaiShushan | ChaiShushan (60%) | |
Effective Go | BianJiang && ChaiShushan && Fango | ||
Codelab: How to Write Go Code | GangChen | ||
Codelab: Writing Web Applications | dworld | ||
Go For C++ Programmers(C++程序员指南) | BianJiang && ChaiShushan | ||
Language Specification | Fango | ||
Memory Model(内存模型) | ChaiShushan |
中英文对照表(待完善):
英文 | 中文 | 解释 | |
---|---|---|---|
Channel | 信道 | ||
goroutine | Go程 | ||
slice | 切片 |
本文档依照 创作公共约定(署名-非商业性使用-相同方式共享)3.0发布。
Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率。 Go语言语法灵活、简洁、清晰、高效。它对的并发特性可以方便地用于多核处理器 和网络开发,同时灵活新颖的类型系统可以方便地编写模块化的系统。go可以快速编译, 同时具有垃圾内存自动回收功能,并且还支持运行时反射。Go是一个高效、静态类型, 但是又具有解释语言的动态类型特征的系统级语法。
下面是用go编写的"Hello, world"程序:
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
Go是一个开源项目,采用BSD授权协议。 该文档介绍如何获取Go源代码,如何编译,以及如何运行Go程序。
目前有两种方式使用Go语言。这里主要讲述如何使用Go专用的gc系列工具 (6g、8g等)。另一个可选的编译器是 基于gcc后端的 gccgo编译器。关于gccgo的细节清参考安装并使用gccgo编译器 。
Go编译器可以支持三种指令集。不同体系结构生成的代码质量有一些差别:
最成熟的实现,编译器在寄存器级别优化,可以生成高质量的目标代码(有时候gccgo可能更优)。
amd64平台的的完整移植。
在完善中。目前只支持生成Linux的二进制文件,浮点支持比较匮乏,并且生成目标代码时还存在bug。还没有完全通过测试集,也没有任何优化。
除了系统级的接口,go需要的运行时环境对各个平台都是一致的。包含 mark-and-sweep 垃圾内存自动回收(更高效的算法实现正在开发中), 数组、字符串、智能堆栈 以及 goroutine 等。
目前支持以下系统:FreeBSD、Linux、Native Client 和 OS X (a.k.a. Darwin)。Microsoft Windows 目前正在移植中, 功能还不完整。关于各个系统平台的详细说明,可以参考后面的 [环境变量] 一节。
Go的工具链采用C语言编写,构建需要安装以下开发工具:
对于 OS X 系统,以上工具是Xcode的一部分。
对于 Ubuntu/Debian 系统,运行安装命令: sudo apt-get install bison ed gawk gcc libc6-dev make
在进行后面的操作之前需要安装Mercurial版本管理系统(可以输出hg名字检测是否安装)。安装输入以下命令:
sudo easy_install mercurial
对于 Ubuntu/Debian 系统,easy_install 命令可以用 apt-get install python-setuptools python-dev build-essential
安装。
如果上述命令安装失败的话,还可以从 Mercurial Download 下载。
以下命令会创建一个go目录。切换到相应目录,并且确保当前位置不存在go目录,运行命令:
$ hg clone -r release https://go.googlecode.com/hg/ go
编译go环境:
$ cd go/src $ ./all.bash
编译完成后,结尾会打印以下信息。
--- cd ../test --- Installed Go for linux/amd64 in /home/you/go. Installed commands in /home/you/go/bin. *** You need to add /home/you/go/bin to your $PATH. *** The compiler is 6g.
其中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 < 在连接的时候,没有必要列出hello.6引用的包(这里用到了fmt包)。 连接器(这里是6l)会自动从hello.6文件获取包的引用信息。 如果是编译更复杂的过程,那么可能需要使用Makefile。相关的例子可以 参考 当有新版本发布的时候,会在Go Nuts邮件列表中通知。可以用以下命令获取最新的发布版本: $ cd go/src
$ hg pull
$ hg update release
$ ./all.bash
在 Freenode IRC 上,可能有很多#go-nuts的开发人员和用户,你可以获取即时的帮助。 还可以访问Go语言的官方邮件列表 Go Nuts。 Bug可以在 Go issue tracker 提交。 对于开发Go语言用户,有令一个专门的邮件列表 golang-checkins。 这里讨论的是Go语言仓库代码的变更。 如果是中文用户,请访问:Go语言中文论坛。 Go编译器需要三个必须的环境变量和一个可选的环境变量。环境变量在.bashrc 或其他配置文件中设置。
Go安装包的根目录。通常是放在$HOME/go,当然也可以是其他位置。
这两个环境变量表示目标代码的操作系统和CPU类型。$GOOS选项有linux、 freebsd、darwin (Mac OS X 10.5 or 10.6) 和 nacl (Chrome的Native Client接口,还未完成)。$GOARCH的 选项有amd64 (64-bit x86,目前最成熟)、386 (32-bit x86)、 和arm (32-bit ARM,还未完成)。下面是$GOOS和 $GOARCH的可能组合:
$GOOS $GOARCH
darwin 386
darwin amd64
freebsd 386
freebsd amd64
linux 386
linux amd64
linux arm incomplete
nacl 386
windows 386 incomplete
指明用于存放go的二进制程序目录。如果是没设置$GOBIN环境变量, 则默认是安装在$HOME/bin。如果设置了该变量,需要确保$PATH 变量也包含这个路径,这样编译器可以找到正确的执行文件。
ARM处理器(待补充)。 需要说明的是$GOARCH和$GOOS环境变量表示的是目标代码 运行环境,和当前使用的平台是无关的。这个对于交叉编译是很方便的。在.bashrc文件中设置以下环境变量: export GOROOT=$HOME/go
export GOARCH=amd64
export GOOS=linux
export PATH=.:$PATH:$GOBIN
检查是否能正常使用: source ~/.bashrc
cd ~
8g -V
本文是关于Go编程语言的基础教程,主要面向有C/C++基础的读者。它并不是一个语言的完整指南,关于 Go的具体细节请参考 语言规范 一文。在读完这个入门教程后, 深入的华可以继续看 Effective Go ,这个文档 将涉及到Go语言的更多特性。此外,还有一个《Go语言三日教程》系列讲座: 第一日, 第二日, 第三日。 下面将通过一些小程序来演示go语言的一些关键特性。所有的演示程序都是可以运行的,程序的代码在安装目录的 文中的代码都会标出在源代码文件中对应的行号。同时为了清晰起见,我们忽略了源代码文件空白行的行号。 让我们从经典的"Hello, World"程序开始: 05 package main
07 import fmt "fmt" // Package implementing formatted I/O.
09 func main() {
10 fmt.Printf("Hello, world; or Καλημ?ρα κ?σμε; or こんにちは 世界n")
11 }
每个Go源文件开头都有一个 关键字 常量字符串可以包含Unicode字符,采用UTF-8编码。实际上,所有的Go语言源文件都采用UTF-8编码。 代码注释的方式和C++类似: /* ... */
// ...
稍后,我们还有很多的关于打印的话题。 比较细心的读者可能发现前面的代码中基本没有出现分号 当然,你也可以像C或JAVA中那样使用分号。不过在大多数情况下,一个完整语句末尾的分号 都是有go编译器自动添加的——用户不需要输入每个分号。 关于分号的详细描述,可以查看Go语言说明文档。不过在实际写代码时,只需要记得一行末尾的分号 可以省略就可以了(对于一行写多个语句的,可以用分号隔开)。还有一个额外的好处是:在退出 大括号包围的子区域时,分号也是可以省略的。 在一些特殊情况下,甚至可以写出没有任何分号的代码。不过有一个重要的地方:对于"if"等 后面有大括弧的语句,需要将左大括弧放在"if"语句的同一行,如果不这样的话可能出现编译错误。 Go语言强制使用将开始大括弧放在同一行末尾的编码风格。$GOROOT/src/cmd/godoc/Makefile
和$GOROOT/src/pkg/*/Makefile
。3.7. 进一步学习
3.8. 更新go到新版本
3.9. 社区资源
3.10. 环境变量
4. Go语言入门
4.1. 简介
/doc/progs/
子目录中。4.2. Hello,世界
package
声明语句,指明源文件所在的包。同时,我们也可以根据具体的需要 来选择导入(import
语句)特定功能的包。在这个例子中,我们通过导入fmt
包来使用我们熟悉的printf
函数。 不过在Go语言中,Printf
函数的是大写字母开头,并且以fmt
包名作为前缀:fmt.Printf
。func
用于定义函数。在所有初始化完成后,程序从main
包中的main
函数开始执行。4.3. 分号(Semicolons)
;
。其实在go语言中,只有在分隔 for循环的初始化语句时才经常用到;但是代码段末尾的分号一般都是省略的。