基本信息
- 原书名:The Go Programming Language
- 作者: (美)艾伦A. A.多诺万(Alan A. A. Donovan) (美)布莱恩W.柯尼汉(Brian W. Kernighan)
- 译者: 李道兵
- 丛书名: 计算机科学丛书
- 出版社:机械工业出版社
- ISBN:9787111558422
- 上架时间:2017-4-18
- 出版日期:2017 年4月
- 开本:16开
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > 综合 > 高级程序语言设计
教材

内容简介
作译者
艾伦 A. A. 多诺万(Alan A. A. Donovan),谷歌公司Go开发团队成员。他拥有剑桥大学和麻省理工学院计算机科学学士和硕士学位,从1996年开始就在工业界从事软件研发和编程工作。2005年起,他开始在谷歌公司工作,从事基础架构项目研发,是谷歌软件构建工具Blaze的联合设计师。他还创建了用于Go程序静态分析的许多库和工具,包括oracle、godoc -analysis、 eg和gorename。
布莱恩 W. 柯尼汉(Brian W. Kernighan)现为普林斯顿大学计算机科学系教授。他与C语言的发明人Dennis Ritchie共同合作撰写了《C程序设计语言》。1969~2000年间,他是贝尔实验室计算机科学研究中心技术团队的成员,与UNIX的创造者Ken Thompson以及Dennis Ritchie一起工作,同时他也是开发UNIX的主要贡献者。他是 AWK 和 AMPL 编程语言的作者之一,AWK中的K说的就是Kernighan。他还是著名的《程序设计实践》的合著者之一。
目录
译者序
前言
第1章 入门 1
1.1 hello,world 1
1.2 命令行参数 3
1.3 找出重复行 6
1.4 GIF动画 10
1.5 获取一个URL 12
1.6 并发获取多个URL 13
1.7 一个Web服务器 14
1.8 其他内容 17
第2章 程序结构 20
2.1 名称 20
2.2 声明 21
2.3 变量 22
2.3.1 短变量声明 22
2.3.2 指针 23
2.3.3 new函数 25
2.3.4 变量的生命周期 26
译者序
很高兴这次应高博的邀请,与高博及上海七牛信息技术有限公司的几位同事一起来完成本书的翻译。
Go语言在2009年发布,当年就被选为 TIOBE年度语言,并在若干年后的今天,再度当选为TIOBE年度语言。这有力证明了Go语言在工业界和开发者社区的良好口碑,以及与时俱进的生命力。本书简体中文版的出版,可谓恰逢其时!
2012年,Go语言发布1.0版本后,推广速度更是突飞猛进,比如最好的容器软件 Docker 就是用 Go 语言写成的,ETCD、Kubernetes 这类有望构建新一代软件架构的基础软件也是基于Go语言的。除此之外,数据库领域有TiDB和InfluxDB,消息系统有 NSQ,缓存系统有 GroupCache。可以看到,几乎在基础架构软件的每一个领域,都涌现了由Go语言编写的新软件,这些软件已经取得或者正在取得越来越高的市场占有率。除了作为基础架构软件的语言之外,Go 语言作为服务器端通用语言的机会也越来越多,这从 Beego、Gorilla 等Go语言Web框架的热门程度也可以看出一些端倪。
在基础架构软件这个层面,最早只有C语言,后来又有了C++语言。在性能不受影响的情况下,C++语言让我们得以驾驭规模更大、更复杂的项目,比如 MySQL、MongoDB 这类数据库软件就是用 C++语言写的。尽管C++语言功能强大,但是它并没有太好地解决代码的易用性和健壮性互相平衡的问题,所以我们接下来看到了很多基于Java语言的基础架构软件的出现,例如整个 Hadoop生态。在这之后,随着高并发需求的逐步增强,不少针对高并发设计的语言流行起来,如 Erlang(代表作 RabbitMQ)、Scala(代表作 Apache Spark),还有最近由Mozilla 基金会推出的 Rust,以及本书的主角 Go 语言。从目前的状态来看, Go 语言取得的成就远高于其他三种语言,尽管未来究竟哪种语言会成为新的基础架构语言还不可知,但高并发肯定会是一个必备的特性。
Go 语言的作者是Robert Griesemer、Rob Pike和Ken Thompson,与我年龄相仿的程序员对 Ken Thompson应该不会陌生,他在UNIX和C语言开发中的巨大贡献让他的名字被大量的程序员所熟知。也正因为如此,在Go语言中,我们看到了大量 C 的痕迹和UNIX的设计哲学。
本书的作者之一Brian Kernighan也是著名的经典C语言手册《C程序设计语言》的作者,程序员们甚至将《C程序设计语言》亲切地称为“K&R C”。而本书的名字也暗示了全书的品质将再现经典。我们也不应该忽视,Kernighan和 Go语言作者之一Rob Pike是另一本经典作品《程序设计实践》的作者。这些极其珍贵的历史经验和始终在第一线实践的宝贵经验,结合作者多年的教学和写作凝成的文笔,更是为本书的经典品质铸就了坚实的基础。我们在翻译本书中充分体会到:通过对一个又一个语言特性深入浅出的介绍,对设计取舍和具体实例的全面分析,以及与其他语言的综合对比,本书揭示了Go语言背后的设计思想。本书能够让新手一开始就走在正确的道路上,让老手能够更精准地把握语言的设计意图,确实是Go语言的一本经典之作!
这本书是“七牛人”为推广Go语言贡献的第三本书,2012年上海七牛信息技术有限公司的创始人许式伟和吕桂华合著了国内的第一本Go语言书籍《Go语言编程》,2013年又集合该公司的力量翻译了本书,还组织了以Go语言为主题的ECUG年度大会。“七牛云”从Go语言中获益良多,我们也很乐于为 Go 语言以及Go社区的发展贡献一份我们自己的力量。
祝大家开卷有益!
李道兵
上海七牛信息技术有限公司首席架构师
前言
“Go是一种开源的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。”(来自Go官网golang.org)
Go在2007年9月形成构想,并于2009年11月发布,其发明人是Robert Griesemer、Rob Pike和Ken Thompson,这几位都任职于Google。该语言及其配套工具集使得编译和执行既富有表达力又高效,而且使得程序员能够轻松写出可靠、健壮的程序。
Go和C从表面上看起来相似,而且和C一样,它也是专业程序员使用的一种工具,兼有事半功倍之效。但是Go远不止是C的一种升级版本。基于多种其他语言,它取其精华,去其糟粕。它实现并发功能的设施是全新的、高效的,实现数据抽象和面向对象的途径是极其灵活的。它还实现了自动化的内存管理,或称为垃圾回收。
Go特别适用于构建基础设施类软件(如网络服务器),以及程序员使用的工具和系统等。但它的的确确是一种通用语言,而且在诸多领域(如图像处理、移动应用和机器学习)中都能发现它的身影。它在很多场合下用于替换无类型的脚本语言,这是由于它兼顾了表达力和安全性:Go程序通常比动态语言程序运行速度要快,由于意料之外的类型错误而导致崩溃的情形更是少得多。
Go是个开源项目,所以其编译器、库和工具的源代码是人人皆可免费取得的。来自全世界的社区都在积极地向这个项目贡献代码。Go的运行环境包括类UNIX系统——Linux、FreeBSD、OpenBSD和Mac OS X,还有Plan 9和Microsoft Windows。只要在其中一个环境中写了一个程序,那么基本上不加修改它就可以运行在其他环境中。
本书旨在帮助读者立刻开始使用Go,以及熟练掌握这门语言,并充分地利用Go的语言特性和标准库来撰写清晰的、符合习惯用法的、高效的程序。
Go的起源
和生物学物种一样,成功的语言会繁衍后代,这些后代语言会从它们的祖先那里汲取各种优点;有时候,语言间的“混血”会产生异常强大的力量;在一些罕见情况下,某个重大的语言特性也可能凭空出现而并无先例。通过考察语言间的影响,我们可以学得不少知识,比如语言为什么会变成这个样子,以及它适合用于哪些环境,等等。
下图展示了更早出现的程序设计语言对Go产生的最重要影响。
Go有时会称为“类C语言”或“21世纪的C”。从C中,Go继承了表达式语法、控制流语句、基本数据类型、按值调用的形参传递和指针,但比这些更重要的是,继承了C所强调的要点:程序要编译成高效的机器码,并自然地与所处的操作系统提供的抽象机制相配合。
可是,Go的家谱中还有其他祖先。产生主要影响的是由Niklaus Wirth设计的、以Pascal为发端的一个语言支流。Modula-2启发了包概念。Oberon消除了模块接口文件和模块实现文件之间的差异。Oberon-2影响了包、导入和声明的语法,并提供了方法声明的语法。
Go的另一支世系祖先——它使得Go相对于当下的程序设计语言显得卓然不群,是在贝尔实验室开发的一系列名不见经传的研究用语言。这些语言都受到了通信顺序进程(Communicating Sequential Process,CSP)的启发,CSP由Tony Hoare于1978年在发表的关于并发性基础的开创性论文中提出。在CSP中,程序就是一组无共享状态进程的并行组合,进程间的通信和同步采用通道完成。不过,Hoare提出的CSP是一种形式语言,仅用于描述并发性的基本概念,并不是一种用来撰写可执行程序的程序设计语言。
Rob Pike等人开始动手做一些实验,尝试把CSP实现为真正的语言。第一种这样的语言称为Squeak(“和鼠类沟通的语言”),它是一种用于处理鼠标和键盘事件的语言,其中具有静态创建的通道。紧接着它的是Newsqueak,它具有类C的语句和表达式语法,以及类Pascal的类型记法。它是一种纯粹的函数式语言,具有垃圾回收功能,同样也以管理键盘、鼠标和窗口事件为目标。通道变成了“一等”值(first-class value),它可以动态创建并用变量存储。
Plan 9操作系统将这些思想都纳入一种称为Alef的语言中。Alef尝试将Newsqueak改造成一种可用的系统级程序设计语言,但垃圾回收功能的缺失使得它在处理并发性时捉襟见肘。
Go中的其他结构也会不时显示出某些并非来自祖先的基因。例如,iota多多少少有点APL的影子,而嵌套函数的词法作用域则来自Scheme(以及由之而来的大部分语言)。在Go语言中,也可以发现全新的变异。Go中新颖的slice不仅为动态数组提供了高效的随机访问功能,还允许旧式链表的复杂共享机制。另外,defer语句也是Go中新引入的。
Go项目
所有的程序设计语言都反映了其发明者的程序设计哲理,其中相当大的一部分是对于此前语言已知缺点的应对措施。Go这个项目也诞生于挫败感,这种挫败感来源于Google的若干复杂性激增的软件系统。(而且这个问题绝非Google所独有的。)
“复杂性是以乘积方式增长的。”Rob Pike如是说。为了修复某个问题,一点点地将系统的某个部分变得更加复杂,这不可避免地也给其他部分增加了复杂性。在不断要求增加系统功能、选项和配置,以及快速发布的压力之下,简单性往往被忽视了(尽管长期来看,简单性才是好软件的不二法门)。
要实现简单性,就要求在项目的一开始就浓缩思想的本质,并在项目的整个生命周期制定更具体的准则,以分辨出哪些变化是好的,哪些是坏的或致命的。只要足够努力,好的变化就既可以实现目的,又能够不损害Fred Brooks所谓软件设计上的“概念完整性”。坏的变化就做不到这一点,而致命的变化则会牺牲“简单性”去换得浅薄的“方便性”。但是,只有通过设计上的简单性,系统才能在增长过程中保持稳定、安全和自洽。
媒体评论
本书是Go程序员的权威学习资料和教程,旨在帮助人们立刻开始使用Go,并且熟练掌握这门语言,以及充分利用Go的语言特性和标准库来撰写清晰、高效的程序,从而解决现实问题。
本书主要内容
·第1章介绍Go语言的基础概念,通过十几个完成日常任务(包括读写文件、格式化文本、创建图像以及在Internet客户端和服务器之间通信)的程序来介绍这门语言。
·开始的几章讲述Go程序的组成元素(语法、控制流、数据类型),以及程序的组织(包、文件和函数);后面的几章详细解释了包机制,以及如何高效地利用go工具来构建、测试和维护项目。
·第6章和第7章介绍Go如何以一种不同寻常的方式来实现面向对象的程序设计,其中方法可以关联到任何用户定义的类型。具体类型和抽象类型(即接口)之间的关系是隐式的,所以一个具体类型可能会实现该类型设计者所没有意识到的接口。
·第8章和第9章深入讨论并发性方面的重要内容。第8章介绍goroutine和通道的基本机制,并解释了CSP模型。第9章讨论了并发性中较传统的方面,使用共享变量来实现并发。
·最后两章探讨Go的低级特性。第12章讲解使用反射的元编程艺术。第13章展示如何运用unsafe包来绕过Go的类型系统,以及如何使用cgo工具来调用C代码。
本书包含规范的代码,配有数百个典型示例,涵盖整个Go语言及其最重要的包和广泛的应用。每章都附有一定数量的练习,可以帮助读者加深对Go基础知识的理解。源代码可以从位于http://gopl.io/的公开Git仓库下载,并且能够方便地使用go get命令获取、构建和安装。