热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go语言文档

Go语言文档,Go语言社区,Golang程序员人脉社
Go语言文档 [Go语言中文小组] 翻译整理
2011-03-02


  1. 关于本文
  2. Go语言简介
  3. 安装go环境
    • 3.1. 简介
    • 3.2. 安装C语言工具
    • 3.3. 安装Mercurial
    • 3.4. 获取代码
    • 3.5. 安装Go
    • 3.6. 编写程序
    • 3.7. 进一步学习
    • 3.8. 更新go到新版本
    • 3.9. 社区资源
    • 3.10. 环境变量
  4. Go语言入门
    • 4.1. 简介
    • 4.2. Hello,世界
    • 4.3. 分号(Semicolons)
    • 4.4. 编译
    • 4.5. Echo
    • 4.6. 类型简介
    • 4.7. 申请内存
    • 4.8. 常量
    • 4.9. I/O包
    • 4.10. Rotting cats
    • 4.11. Sorting
    • 4.12. 打印输出
    • 4.13. 生成素数
    • 4.14. Multiplexing
  5. Effective Go
    • 5.1. 简介
      • 5.1.1. 例子
    • 5.2. 格式化
    • 5.3. 注释
    • 5.4. 命名
      • 5.4.1. 包的命名
      • 5.4.2. 接口的命名
      • 5.4.3. 大小写混写
    • 5.5. 分号
    • 5.6. 控制流
      • 5.6.1. If
      • 5.6.2. For
      • 5.6.3. Switch
    • 5.7. 函数
      • 5.7.1. 多值返回
      • 5.7.2. 命名的结果参数
      • 5.7.3. Defer
    • 5.8. 数据
      • 5.8.1. new()分配
      • 5.8.2. 构造和结构初始化
      • 5.8.3. make()分配
      • 5.8.4. 数组
      • 5.8.5. Slices 切片
      • 5.8.6. Maps 字典
      • 5.8.7. 打印
      • 5.8.8. Append
    • 5.9. 初始化
      • 5.9.1. Constants 常量初始化
      • 5.9.2. 变量初始化
      • 5.9.3. init函数
    • 5.10. 方法
      • 5.10.1. 指针vs值
    • 5.11. 接口和其他类型
      • 5.11.1. 接口
      • 5.11.2. 转换
      • 5.11.3. Generality(泛化)
      • 5.11.4. 接口和方法
    • 5.12. 内置
    • 5.13. 并发
      • 5.13.1. 交流来分享
      • 5.13.2. Goroutines(Go程)
      • 5.13.3. Channels(信道)
      • 5.13.4. Channels of channels(信道的信道)
      • 5.13.5. 并发
      • 5.13.6. 漏水缓冲
    • 5.14. 错误处理
      • 5.14.1. Panic(怕死)
      • 5.14.2. Recover(回生)
    • 5.15. Web服务器
  6. 如何编写Go程序
    • 6.1. 简介
    • 6.2. 社区资源
    • 6.3. 新建一个包
      • 6.3.1. Makefile
      • 6.3.2. Go源文件
    • 6.4. 测试
    • 6.5. 一个带测试的演示包
  7. Codelab: 编写Web程序
    • 7.1. 简介
    • 7.2. 开始
    • 7.3. 数据结构
    • 7.4. 使用http包
    • 7.5. 基于http提供wiki页面
    • 7.6. 编辑页面
    • 7.7. template包
    • 7.8. 处理不存在的页面
    • 7.9. 储存页面
    • 7.10. 错误处理
    • 7.11. 模板缓存
    • 7.12. 验证
    • 7.13. 函数文本和闭包
    • 7.14. 试试!
    • 7.15. 其他任务
  8. 针对C++程序员指南
    • 8.1. 概念差异
    • 8.2. 语法
    • 8.3. 常量
    • 8.4. Slices(切片)
    • 8.5. 构造值对象
    • 8.6. Interfaces(接口)
    • 8.7. Goroutines
    • 8.8. Channels(管道)
  9. 内存模型
    • 9.1. 简介
    • 9.2. Happens Before
    • 9.3. 同步(Synchronization)
      • 9.3.1. 初始化
      • 9.3.2. Goroutine的创建
      • 9.3.3. Channel communication 管道通信
      • 9.3.4. 锁
      • 9.3.5. Once
    • 9.4. 错误的同步方式
  10. 附录
    • 10.1. 命令行工具
      • 10.1.1. 8g
      • 10.1.2. 8l
      • 10.1.3. 8a
      • 10.1.4. gomake
      • 10.1.5. cgo
      • 10.1.6. gotest
      • 10.1.7. Goyacc
      • 10.1.8. gopack
      • 10.1.9. gofmt
      • 10.1.10. goinstall
    • 10.2. 视频和讲座
      • 10.2.1. Go Programming
      • 10.2.2. The Go Tech Talk
      • 10.2.3. gocoding YouTube Channel
      • 10.2.4. The Expressiveness Of Go
      • 10.2.5. Another Go at Language Design
      • 10.2.6. Go Emerging Languages Conference Talk
      • 10.2.7. The Go Promo Video
      • 10.2.8. The Go Programming Language
      • 10.2.9. Go语言:互联网时代的C
    • 10.3. Release History
      • 10.3.1. 2010-11-23
    • 10.4. Go Roadmap
      • 10.4.1. Language roadmap
      • 10.4.2. Implementation roadmap
      • 10.4.3. Gc compiler roadmap
      • 10.4.4. Gccgo compiler roadmap
      • 10.4.5. Done
    • 10.5. 相关资源


1. 关于本文

本文档是由 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发布。


2. Go语言简介

Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率。 Go语言语法灵活、简洁、清晰、高效。它对的并发特性可以方便地用于多核处理器 和网络开发,同时灵活新颖的类型系统可以方便地编写模块化的系统。go可以快速编译, 同时具有垃圾内存自动回收功能,并且还支持运行时反射。Go是一个高效、静态类型, 但是又具有解释语言的动态类型特征的系统级语法。

下面是用go编写的"Hello, world"程序:

package main import "fmt" func main() { fmt.Println("Hello, 世界") }


3. 安装go环境

3.1. 简介

Go是一个开源项目,采用BSD授权协议。 该文档介绍如何获取Go源代码,如何编译,以及如何运行Go程序。

目前有两种方式使用Go语言。这里主要讲述如何使用Go专用的gc系列工具 (6g、8g等)。另一个可选的编译器是 基于gcc后端的 gccgo编译器。关于gccgo的细节清参考安装并使用gccgo编译器 。

Go编译器可以支持三种指令集。不同体系结构生成的代码质量有一些差别:

amd64 (a.k.a. x86-64); 6g,6l,6c,6a

最成熟的实现,编译器在寄存器级别优化,可以生成高质量的目标代码(有时候gccgo可能更优)。

386 (a.k.a. x86 or x86-32); 8g,8l,8c,8a

amd64平台的的完整移植。

arm (a.k.a. ARM); 5g,5l,5c,5a

在完善中。目前只支持生成Linux的二进制文件,浮点支持比较匮乏,并且生成目标代码时还存在bug。还没有完全通过测试集,也没有任何优化。

除了系统级的接口,go需要的运行时环境对各个平台都是一致的。包含 mark-and-sweep 垃圾内存自动回收(更高效的算法实现正在开发中), 数组、字符串、智能堆栈 以及 goroutine 等。

目前支持以下系统:FreeBSD、Linux、Native Client 和 OS X (a.k.a. Darwin)。Microsoft Windows 目前正在移植中, 功能还不完整。关于各个系统平台的详细说明,可以参考后面的 [环境变量] 一节。

3.2. 安装C语言工具

Go的工具链采用C语言编写,构建需要安装以下开发工具:

  • GCC,
  • C语言标准库,
  • Bison,
  • make,
  • awk, 和
  • ed (编辑器).

对于 OS X 系统,以上工具是Xcode的一部分。

对于 Ubuntu/Debian 系统,运行安装命令: sudo apt-get install bison ed gawk gcc libc6-dev make

3.3. 安装Mercurial

在进行后面的操作之前需要安装Mercurial版本管理系统(可以输出hg名字检测是否安装)。安装输入以下命令:

sudo easy_install mercurial

对于 Ubuntu/Debian 系统,easy_install 命令可以用 apt-get install python-setuptools python-dev build-essential 安装。

如果上述命令安装失败的话,还可以从 Mercurial Download 下载。

3.4. 获取代码

以下命令会创建一个go目录。切换到相应目录,并且确保当前位置不存在go目录,运行命令:

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

3.5. 安装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对于不同的版本会有差异,表示没有通过测试的数目。

3.6. 编写程序

以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。相关的例子可以 参考 $GOROOT/src/cmd/godoc/Makefile 和$GOROOT/src/pkg/*/Makefile

3.7. 进一步学习

3.8. 更新go到新版本

当有新版本发布的时候,会在Go Nuts邮件列表中通知。可以用以下命令获取最新的发布版本:

$ cd go/src $ hg pull $ hg update release $ ./all.bash

3.9. 社区资源

在 Freenode IRC 上,可能有很多#go-nuts的开发人员和用户,你可以获取即时的帮助。

还可以访问Go语言的官方邮件列表 Go Nuts。

Bug可以在 Go issue tracker 提交。

对于开发Go语言用户,有令一个专门的邮件列表 golang-checkins。 这里讨论的是Go语言仓库代码的变更。

如果是中文用户,请访问:Go语言中文论坛。

3.10. 环境变量

Go编译器需要三个必须的环境变量和一个可选的环境变量。环境变量在.bashrc 或其他配置文件中设置。

$GOROOT

Go安装包的根目录。通常是放在$HOME/go,当然也可以是其他位置。

$GOOS and 和 $GOARCH

这两个环境变量表示目标代码的操作系统和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

$GOBIN (optional) (可选)

指明用于存放go的二进制程序目录。如果是没设置$GOBIN环境变量, 则默认是安装在$HOME/bin。如果设置了该变量,需要确保$PATH 变量也包含这个路径,这样编译器可以找到正确的执行文件。

$GOARM (optional, arm, default=6)

ARM处理器(待补充)。

需要说明的是$GOARCH和$GOOS环境变量表示的是目标代码 运行环境,和当前使用的平台是无关的。这个对于交叉编译是很方便的。在.bashrc文件中设置以下环境变量:

export GOROOT=$HOME/go export GOARCH=amd64 export GOOS=linux export PATH=.:$PATH:$GOBIN

检查是否能正常使用:

source ~/.bashrc cd ~ 8g -V


4. Go语言入门

4.1. 简介

本文是关于Go编程语言的基础教程,主要面向有C/C++基础的读者。它并不是一个语言的完整指南,关于 Go的具体细节请参考 语言规范 一文。在读完这个入门教程后, 深入的华可以继续看 Effective Go ,这个文档 将涉及到Go语言的更多特性。此外,还有一个《Go语言三日教程》系列讲座: 第一日, 第二日, 第三日。

下面将通过一些小程序来演示go语言的一些关键特性。所有的演示程序都是可以运行的,程序的代码在安装目录的 /doc/progs/ 子目录中。

文中的代码都会标出在源代码文件中对应的行号。同时为了清晰起见,我们忽略了源代码文件空白行的行号。

4.2. Hello,世界

让我们从经典的"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源文件开头都有一个package声明语句,指明源文件所在的包。同时,我们也可以根据具体的需要 来选择导入(import语句)特定功能的包。在这个例子中,我们通过导入fmt包来使用我们熟悉的printf函数。 不过在Go语言中,Printf函数的是大写字母开头,并且以fmt包名作为前缀:fmt.Printf

关键字func用于定义函数。在所有初始化完成后,程序从main包中的main函数开始执行。

常量字符串可以包含Unicode字符,采用UTF-8编码。实际上,所有的Go语言源文件都采用UTF-8编码。

代码注释的方式和C++类似:

/* ... */ // ...

稍后,我们还有很多的关于打印的话题。

4.3. 分号(Semicolons)

比较细心的读者可能发现前面的代码中基本没有出现分号;。其实在go语言中,只有在分隔 for循环的初始化语句时才经常用到;但是代码段末尾的分号一般都是省略的。

当然,你也可以像C或JAVA中那样使用分号。不过在大多数情况下,一个完整语句末尾的分号 都是有go编译器自动添加的——用户不需要输入每个分号。

关于分号的详细描述,可以查看Go语言说明文档。不过在实际写代码时,只需要记得一行末尾的分号 可以省略就可以了(对于一行写多个语句的,可以用分号隔开)。还有一个额外的好处是:在退出 大括号包围的子区域时,分号也是可以省略的。

在一些特殊情况下,甚至可以写出没有任何分号的代码。不过有一个重要的地方:对于"if"等 后面有大括弧的语句,需要将左大括弧放在"if"语句的同一行,如果不这样的话可能出现编译错误。 Go语言强制使用将开始大括弧放在同一行末尾的编码风格。

推荐阅读
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
author-avatar
我还没公主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有