Go程序设计语言(英文版)
作者 : [美]艾伦 A. A. 多诺万(Alan A. A. Donovan)布莱恩 W. 柯尼汉(Brian W. Kernighan)著
丛书名 : 经典原版书库
出版日期 : 2016-01-18
ISBN : 978-7-111-52628-5
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 英文
页数 : 380
开本 : 16
原书名 : The Go Programming Language
原出版社: Pearson Education Asia
属性分类: 教材
包含CD :
绝版 :
图书简介

Go语言是谷歌推出的一种全新的C语言风格的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,提高编程效率,适合开发大型软件,有望成为主流的编程语言。
本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队合作编写而成,是关于Go语言编程的权威著作。

图书特色

亚马逊读者评论:
目前最佳的Go语言的编程书。
因为作者的盛名和专业,我对这本书有很高的期望。我必须说,所有这些期望都得到了满足。
这可能是我读过的最好的编程语言书之一。如果你对学习Go语言感兴趣,或每天在工作中要使用它,这将是一本你必须拥有和仔细研读的书。
——John H. 2015/12/10

继承K&R精髓的Go语言编程的权威著作。
像许多其他的程序员一样,我是通过阅读K&R的《C程序设计语言》一书来学会编写C程序的。本书是继承K&R精髓的Go程序设计语言的教程,读者对象是那些已经是程序员、喜欢实例胜于理论的专业人士。
如果你是一个程序员并且想要学习Go语言,本书是我想要首先推荐给你阅读和学习的书。
—— mathew VINE VOICE 2015/12/4

最棒的Go语言的书!
这是一本很棒的书。我喜欢它解释概念的方式,看似基本但同时具有深度。我会向任何想要学习Go语言的人推荐这本书。Go是一门美妙的语言。我们现在有几个同事在读这本书,因为它非常有助于学习Go。这本书中的练习非常棒,非常实用,都是程序员在工作中会遇到的问题。
—— Quintin 2015/12/1

完美的Go之书。
这本书非常完美。书中所述内容正是官方文档所缺乏的。
——Jeff 2015/11/24

毫无疑问,你必须读这本书。
读这本书是一种真正的快乐。清晰而准确的解释,每一个词都恰到好处。建议你仔细阅读每个句子和每个词,真是字字珠玑。无论你是Go语言的新手,还是有初步Go语言编程经验的程序员,都会喜欢读它。
——Anton Moiseev 2015/11/12

豆瓣读者评论:
Kernighan的文风极其流畅,完全达到了当年《C程序设计语言》的意境。将Go的种种娓娓道来,思路清晰,细节周全但不繁琐,知其然更知其所以然。
——dalin 2015/11/24

比golang官网的文档要细致,尤其是面向对象、接口部分,适合通读查阅。
——icemelon 2015/11/6

《C程序设计语言》的作者Kernighan教授与谷歌Go开发团队核心成员Donovan联合编写。
凝聚大师毕生造诣,融合Go开发团队智慧,经典与权威的碰撞,打造Go语言编程圣经。
尽得《C程序设计语言》的精髓,简洁实用,字字珠玑,学习Go语言程序设计的权威指南。
《C程序设计语言》的作者Kernighan教授与谷歌Go开发团队核心成员Donovan联合编写。
凝聚大师毕生造诣,融合Go开发团队智慧,经典与权威的碰撞,打造Go语言编程圣经。
尽得《C程序设计语言》的精髓,简洁实用,字字珠玑,学习Go语言程序设计的权威指南。

“Go是一种开放源代码的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。”
来自Go官网golang.org

本书是所有想要学习Go语言的程序员的权威学习资源和教程,旨在帮助你立刻开始使用Go,以及良好地掌握这门语言,并充分地利用Go的语言特性和标准库来撰写清晰的、符合习惯用法的、高效的程序,以解决现实世界的问题。作者不要求读者了解Go语言或已经具有任何具体程序语言的编程经验,所以无论你是用像C、C++或Java那样的编译型语言编过程序,还是有过像Python、Ruby或JavaScript那样的解释型语言的编程经历,都会觉得这本书易于理解和学习。
本书的组织结构
第1章介绍Go语言的基础概念,通过十几个完成日常任务(包括读写文件、格式化文本、创建图像,以及在Internet客户端和服务器之间通信)的程序来介绍这门语言。
开始的几章覆盖Go程序的组成元素(语法、控制流、数据类型),以及程序的组织(包、文件和函数)。后面的几章详细解释了包机制,以及如何高效地利用go工具来构建、测试和维护项目。
关于方法和接口的两章(第6章和第7章)介绍Go以一种不同寻常的方式来诠释面向对象程序设计,其中方法可以关联到任何用户自定义的类型,而具体类型和抽象类型(即接口)之间的关系是隐式的,具体类型可能会满足一个该类型设计者没有意识到其存在的接口。书中用实际例子来解释封装、组合、可替代性。
关于并发的两章(第8章和第9章)深入讨论这个日益重要的主题。第8章介绍goroutine和信道的基本机制,说明了被称为CSP(Communicating Sequential Process)的模型。第9章讨论了并发性中较传统的方面,使用共享变量来实现并发。这两章内容为程序员首次遇到并发问题打下坚实基础。
最后两章研讨Go的低级特性。第12章讲解使用反射的元编程的艺术。第13章展示了如何运用unsafe包来绕过Go的类型系统,以及如何使用cgo工具来调用C代码。
本书代码编写规范,配有数百个有用实例,涵盖整个Go语言及其最重要的包和广泛的应用。每章都附有一定数量的练习,可以用来测试读者对Go的理解,或是探索对书中示例的扩展和变形。源代码可以从位于http://gopl.io/的公开Git仓库下载,并且能够方便地使用go get命令获取、构建和安装。

作者简介




艾伦 A. A. 多诺万(Alan A. A. Donovan)
谷歌公司Go开发团队成员。他拥有剑桥大学和麻省理工学院计算机科学学位,从1996年开始就在工业界从事软件研发和编程工作。2005年起,他开始在谷歌公司工作,从事基础架构项目研发,是谷歌软件构建工具Blaze的联合设计师。他还创建了用于Go程序静态分析的许多库和工具,包括oracle、godoc -analysis、eg和gorename。




布莱恩 W. 柯尼汉(Brian W. Kernighan)
普林斯顿大学计算机科学系教授。他是《C程序设计语言》的作者之一,与C语言的发明人Dennis Ritchie共同合作了这本书。1969~2000年期间,他是贝尔实验室计算机科学研究中心技术团队的成员,与UNIX的创造者Ken Thompson以及Dennis Ritchie一起工作,同时他也是开发UNIX的主要贡献者。他是 AWK 和 AMPL 编程语言的作者之一,AWK中的K说的就是Kernighan。他还是《程序设计实践》的合著者之一。

图书前言

“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影响了包、导入和声明语法。Object Oberon则提供了方法声明语法。
另一支Go的世系祖先,也是使得Go相对于当下的程序设计显得卓然不群者,是一族名不见经传的、在贝尔实验室开发的研究用语言。这些语言都受到了Tony Hoare于1978年发表的关于并发性基础的开创性论文所提出的通信顺序进程(Communicating Sequential Process,CSP)的启发。在CSP中,程序就是一组无共享状态进程的并行组合,进程间的通信和同步采用信道完成。不过,Hoare提出的CSP是一种形式语言,仅用以描述并发性的基本概念,并不是一种用来撰写可执行程序的程序设计语言。
Rob Pike等人开始动手做一些实验,尝试把CSP实现为真正的语言。第一种这样的语言称为Squeak(“和鼠类沟通的语言”),它是一种用以处理鼠标和键盘事件的语言。紧接着它的是Newsqueak,它带来的是类C的语句和表达式语法,以及类Pascal的类型记法。它是一种纯粹的函数式语言,带有垃圾收集,同样也以管理键盘、鼠标和窗口事件为目标。信道成了一等值(first-class value),它可以动态创建并采用变量存储。

Plan 9操作系统将这些思想都纳入了一种称为Alef的语言。Alef尝试将Newsqueak改造成一种可用的系统级程序设计语言,但垃圾收集的缺失使得它在处理并发性时太过痛苦了。
Go中的其他结构也会在这里或那里显示出某些并非来自祖先的基因。例如,iota多多少少有点APL的影子,而嵌套函数的词法作用域则来自Scheme(以及由之而来的大部分语言)。在Go语言中,也可以发现全新的变异。Go的创新性的切片为动态数组提供了高效的随机访问的同时,也允许旧式链表的复杂共享机制。还有,defer语句也是Go中新引入的。
Go项目
所有的程序设计语言都反映了其发明者的程序设计哲学,这其中往往有相当大的一部分是对于此前的语言已知缺点的应对措施。Go这个项目也是诞生于挫败感之中的,这种挫败感来源于Google的若干遭遇了复杂性爆炸性增长的软件系统。(而这个问题绝非Google所独有的。)
“复杂性是以乘积方式增长的。”Rob Pike如是说。为了修复某个问题,一点点地将系统的某个部分变得更加复杂,这不可避免地也给其他部分增加了复杂性。在不断要求增加系统功能和选项以及配置,还要快速发布的压力之下,简单性往往被忽视了—尽管长期来看,简单性才是好软件的不二法门。
要实现简单性,就要求在项目的一开始就将思想浓缩至本质,并在项目的整个生命期多保持一些自律,认识到哪些变化是好的,哪些是坏的或致命的。只要投入足够的努力,好的变化就既可以实现目的,又能够不损害软件设计上的Fred Brooks所谓的“概念完整性”。坏的变化就做不到这一点,而致命的变化则会牺牲“简单性”而去换得其浅薄的兄弟概念—“方便性”。但是,只有通过设计上的简单性,系统才能在增长过程中保持稳定、安全和自洽。
Go项目不仅仅包括语言本身、它的工具和标准库,还有决不能忽视的一点,就是它保持极端简单性的行为文化。在高级语言中,Go出现得较晚,因而有一定后发优势,它的基础部分实现得不错:有垃圾收集、包系统、一等函数、词法作用域、系统调用接口,还有不可变的、默认用UTF-8编码的字符串。但相对来说,它的语言特性不多,而且不太会增加新特性了。比如说,它没有隐式数值类型强制转换,没有构造或析构函数,没有运算符重载,没有形参默认值,没有继承,没有泛型,没有异常,没有宏,没有函数注记,没有线程局部存储。这门语言成熟而稳定,并且保证兼容更早版本:在旧版本的Go语言中写的程序,可以在新版本的编译器和标准库下编译和运行。
Go的类型系统足可以使程序员避免在动态语言中会无意犯下的绝大多数错误,但相对而言,它在带类型的语言中又算是类型系统比较简单的。其实现手法有时候会导致类型框架林立却彼此孤立的“无类型”程序设计风格,并且Go程序员不会在类型方面走到C++或Haskell程序员的那一步—重度地表达类型安全性作为语言具备类型基础的证据。但在实际工作中,Go却能为程序员提供具备相当强类型的系统才能实现的安全性和运行时性能,而不让程序员承担这种系统的复杂性。
Go提倡充分利用当代计算机系统设计,尤其强调局部性的重要。其内建数据类型和大多数库数据结构都经过仔细设计,力求以自然方式工作,而不要求显式的初始化或隐式的构造函数。这么一来,隐藏在代码中的内存分配和内存写入就大大减少了。Go中的聚合类型(结构体和数组)都是以直接方式持有其元素,需要更少的存储以及比使用间接域的语言还少的分配动作和间接指针。由于现代计算机都是并行工作的,正如前面提到的那样,Go有着基于CSP的并行特性。Go还提供了变长栈来运行其轻量级线程,或称为goroutine。这个栈初始化时非常小,所以创建一个goroutine的成本极低,创建100万个也完全可以接受。
Go标准库常常被称作“语言自带电池”,它提供了清晰的构件,以及用于I/O、文本处理、图像、加解密、网络、分布式应用的API,而且对许多标准文件格式和协议都提供了支持。Go的库和工具充分地尊重惯例,减少了配置和解释的需要,从而简化了程序逻辑,提高了多种多样的Go程序之间的相似性,使得它更容易学习和掌握。采用go工具构建的项目,仅使用文件和标识符的名字(在极少情况下使用特殊注释),就可以推断出一个项目使用的所有库、可执行文件、测试、性能基准、示例、平台相关变体,以及文档。Go的源代码中就包含了构建的规格说明。
全书组织
我们假定你用过一两种其他语言编过程序,可能是像C、C++或Java那样的编译型语言,也可能是像Python、Ruby或JavaScript那样的解释型语言,所以我们不会像对一个没有任何基础的初学者那样事无巨细地讲述所有事。表面上的语法大体雷同,变量、常量、表达式、控制流和函数也一样。
第1章是Go的基础结构的综述,通过十几个完成日常任务(包括读写文件、格式化文本、创建图像,以及在Internet客户端和服务器之间通信)的程序来介绍这门语言。
第2章讲述Go程序的组成元素—声明、变量、新类型、包和文件,以及作用域。第3章讨论数值、布尔量、字符串、常量,还解释如何处理Unicode。第4章描述组合类型,即使用简单类型构造的类型,形式有数组、键值对、结构体,还有切片这种Go中动态表的实现。第5章的内容是函数,另外还讨论了错误处理、崩溃和恢复,以及defer语句。
可以看出,第1章到第5章是基础性的,其内容是任何命令式语言都有的。Go的语法和风格可能与其他语言有所不同,但大多数程序员都能很快掌握。余下的章节所关注的则是Go语言中与惯常做法有一定区别的内容,包括方法、接口、并发、包、测试和反射。
Go以一种不同寻常的方式来诠释面向对象程序设计。它没有类继承,甚至没有类。较复杂的对象行为是通过较简单的对象组合而非继承完成的。方法可以关联到任何用户自定义的类型,而不一定是结构体。具体类型和抽象类型(即接口)之间的关系是隐式的,所以一个具体类型可能会满足该类型设计者没有意识到其存在的接口。方法在第6章讲述,接口在第7章讲述。
第8章内容是Go的并发性处理途径,它基于CSP思想,采用goroutine和信道实现。第9章则讨论并发性中较传统的基于共享变量的一些方面的话题。
第10章讨论包,也就是组织库的机制。本章也说明如何高效地利用go工具,仅仅这个工具,就提供了编译、测试、性能基准测定、程序格式化、文档,以及完成许多其他任务的功能。
第11章讨论测试,在这里Go采取了显著的轻量级途径,避免了重重抽象的框架,转而使用简单的库和工具。测试库提供了一个基础,在其之上如有必要就可以构建更复杂的抽象了。
第12章讨论反射,即程序在执行期间考察自身表示的能力。反射是一种强大的工具,不过得小心使用它,本章通过演示如何用它来实现某些重要的Go库,解释了如何找到适当的平衡。第13章解释低阶程序设计的细节,运用unsafe包来绕过Go的类型系统,以及什么时候这样做是合适的。
每章都配以一定数量的练习,你可以用来测试对Go的理解,或是探索对书中示例的扩展和变形。
除了最简单的那些以外,所有书中的示例代码都可以从位于gopl.io的公开Git仓库下载。每个示例由其包的导入路径识别,从而能够方便地使用go get命令获取、构建和安装。你需要选取一个目录作为你的Go工作空间,并将GOPATH环境变量指向之。在必要时,go工具会创建该目录。例如:

欲运行这些例子,你至少需要使用1.5版本的Go语言。

如果你的计算机上的go工具太旧或是缺失,请按https://golang.org/doc/install的指令操作。
更多信息来源
关于Go的更多信息,最好的来源就是Go的官方网站:https://golang.org,它上面列出了文档供读者访问,包括Go程序设计语言规范、标准包,诸如此类。它上面还列出语言综述,指导如何撰写Go程序,以及如何撰写好的Go程序,还有范围广泛的在线文本和视频资源,这些都是对本书的有价值的补充。位于blog.golang.org的Go博客发表的是关于Go的最好文章,以及该语言当下状态、未来计划、会议报告,还有范围广泛的Go相关话题的深度解读。
Go官网在线访问的一个最有用的方面(这也是纸质书的一个令人遗憾的限制),就是它提供了从描述Go程序的网页上直接运行Go程序的能力。这种功能由位于play.golang.org的Go训练场提供,也有嵌入其他页面的,比如位于golang.org的首页,或是由godoc工具提供的文档页面。
训练场为执行简单的实验,撰写短小的程序来检验自己对语法、语义和库包的理解提供了方便,它在很多方面取代了其他语言中的读取–求值–输出循环(Read-Eval-Print Loop,REPL)。它的永久URL对于共享使用Go写成的小段代码、报告缺陷或提出建议都是很有用的。
在训练场的基础之上,位于tour.golang.org的Go综述就是一系列的小型交互式课程,内容是Go语言的基础思想和结构,是整门语言的有序攻略。
训练场和综述的主要缺点在于它只允许导入标准库,还有很多库特性(比如网络库)都出于可操作性或安全原因加以限制了。而要编译和运行每个程序,都要求Internet连接。所以,欲进行更详尽的实验,需要在本机上运行Go程序。幸运的是,下载过程相当直截了当,从golang.org获取Go的分发程序并开始撰写和运行你自己的Go程序,用不了几分钟。
由于Go是个开源项目,你可以从https://golang.org/pkg上在线读取标准库中的任何类型或函数的代码,每个供下载的分发都同样包含这些代码。请使用这些代码来弄明白某些程序的运行原理、回答关于程序细节的问题,也可以用它们来学一学专家是如何写出一流的Go代码的。
致谢
来自Go团队的核心成员Rob Pike和Russ Cox仔细通读了初稿数次,他们对于从词句的斟酌到整体结构和组织的建议都极富价值。在准备本书的日语版时,柴田芳树所做的贡献大大超过了他负担的义务,他的火眼金睛发现了大量英语文本中的不一致性,以及代码中的错误。我们向Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder以及Peter Weinberger对全书初稿所进行的彻底审查和批评建议深表敬意。
我们感激Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao以及Howard Trickey提供的诸多有用建议。 我们也感谢David Brailsford和Raph Levien的排版建议。
我们的Addison-Wesley编辑Greg Doench最初催生了本书,而且一直不断地给予帮助。Addison-Wesley的制作团队—John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith以及Barbara Wood—非常杰出,作者得到了一流的支持。
Alan Donovan想要感谢Google的Sameer Ajmani、Chris Demetriou、Walt Drummond以及Reid Tatge让他有时间来写作这本书,还有Stephen Donovan的建议和及时的鼓励。最重要的是他的妻子Leila Kazemi,她为写作项目提供了毫不犹豫的热情和毫不动摇的支持,即使写作造成了很多家庭生活的分心和缺席。
Brian Kernighan对他的朋友和同事深表谢意,他们对Kernighan花费了很长时间才达成对语言的理解表示了耐心和理解。尤其是他的妻子Meg,她为Kernighan的写作以及太多的其他事务提供了不间断的支持。
纽约
2015年10月

上架指导

计算机\程序设计

封底文字

“Go是一种开放源代码的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。”(来自Go官网golang.org)

本书是所有想要学习Go语言的程序员的权威学习资源和教程,旨在帮助你立刻开始使用Go,以及良好地掌握这门语言,并充分地利用Go的语言特性和标准库来撰写清晰的、符合习惯用法的、高效的程序,以解决现实世界的问题。作者不要求读者了解Go语言或已经具有任何具体程序语言的编程经验,所以无论你是用像C、C++或Java那样的编译型语言编过程序,还是有过像Python、Ruby或JavaScript那样的解释型语言的编程经历,都会觉得这本书易于理解和学习。
本书的组织结构
 第1章介绍Go语言的基础概念,通过十几个完成日常任务(包括读写文件、格式化文本、创建图像,以及在Internet客户端和服务器之间通信)的程序来介绍这门语言。
 开始的几章覆盖Go程序的组成元素(语法、控制流、数据类型),以及程序的组织(包、文件和函数)。后面的几章详细解释了包机制,以及如何高效地利用go工具来构建、测试和维护项目。
 关于方法和接口的两章(第6章和第7章)介绍Go以一种不同寻常的方式来诠释面向对象程序设计,其中方法可以关联到任何用户自定义的类型,而具体类型和抽象类型(即接口)之间的关系是隐式的,具体类型可能会满足一个该类型设计者没有意识到其存在的接口。书中用实际例子来解释封装、组合、可替代性。
 关于并发的两章(第8章和第9章)深入讨论这个日益重要的主题。第8章介绍goroutine和信道的基本机制,说明了被称为CSP(Communicating Sequential Process)的模型。第9章讨论了并发性中较传统的方面,使用共享变量来实现并发。这两章内容为程序员首次遇到并发问题打下坚实基础。
 最后两章研讨Go的低级特性。第12章讲解使用反射的元编程的艺术。第13章展示了如何运用unsafe包来绕过Go的类型系统,以及如何使用cgo工具来调用C代码。
本书代码编写规范,配有数百个有用实例,涵盖整个Go语言及其最重要的包和广泛的应用。每章都附有一定数量的练习,可以用来测试读者对Go的理解,或是探索对书中示例的扩展和变形。源代码可以从位于http://gopl.io/的公开Git仓库下载,并且能够方便地使用go get命令获取、构建和安装。

作者简介

[美]艾伦 A. A. 多诺万(Alan A. A. Donovan)布莱恩 W. 柯尼汉(Brian W. Kernighan)著:艾伦 A. A. 多诺万(Alan A. A. Donovan),谷歌公司Go开发团队成员。他拥有剑桥大学和麻省理工学院计算机科学学位,从1996年开始就在工业界从事软件研发和编程工程。2005年起,他开始在谷歌公司工作,从事基础架构项目研发,是谷歌软件构建工具Blaze的联合设计师。他还创建了用于Go程序静态分析的许多库和工具,包括oracle,godoc -analysis, eg, 和gorename。

布莱恩 W. 柯尼汉(Brian W. Kernighan)现为普林斯顿大学计算机系教授。他是《C程序设计语言》的作者之一,与C语言的发明人Dennis Ritchie共同合作了这本书。1996-2000年期间,他是贝尔实验室计算机科学研究中心技术团队的成员,与Unix的创造者Ken Thompson以及Dennis Ritchie一起工作,同时它也是开发Unix的主要贡献者。他是 AWK 和 AMPL 编程语言的作者之一,AWK中的K说的就是Kernighan。他还是《程序设计实践》。的合著者之一。

图书目录

第1章 综述 1
1.1 Hello,World 1
1.2 命令行参数 4
1.3 查找重复行 8
1.4 GIF动画 13
1.5 获取一个URL 15
1.6 并发获取多个URL 17
1.7 实现一个Web服务器 19
1.8 杂项 23
第2章 程序结构 27
2.1 名字 27
2.2 声明 28
2.3 变量 30
2.4 赋值 36
2.5 类型声明 39
2.6 包和文件 41
2.7 作用域 45
第3章 基本数据类型 51
3.1 整数 51
3.2 浮点数 56
3.3 复数 61
3.4 布尔量 63
3.5 字符串 64
3.6 常量 75
第4章 复合类型 81
4.1 数组 81
4.2 切片 84
4.3 键值对 93
4.4 结构体 99
4.5 JSON 107
4.6 文本和HTML模板 113
第5章 函数 119
5.1 函数声明 119
5.2 递归 121
5.3 多返回值 124
5.4 错误 127
5.5 作为值的函数 132
5.6 匿名函数 135
5.7 变参函数 142
5.8 延后函数调用 143
5.9 崩溃 148
5.10 恢复 151
第6章 方法 155
6.1 方法声明 155
6.2 带有指针接收器的方法 158
6.3 包含嵌入结构体的复合类型 161
6.4 作为值和表达式的方法 164
6.5 示例:位向量类型 165
6.6 封装 168
第7章 接口 171
7.1 作为规约的接口 171
7.2 接口类型 174
7.3 接口约定的达成 175
7.4 使用flag.Value进行标志位分析 179
7.5 作为值的接口 181
7.6 使用sort.Interface进行排序 186
7.7 http.Handler接口 191
7.8 错误接口 196
7.9 示例:表达式评估器 197
7.10 类型断言 205
7.11 使用类型断言分辨错误 206
7.12 使用接口类型断言查询行为 208
7.13 按类型的程序分支 210
7.14 示例:基于标记符号的XML解码 213
7.15 几句建议 216
第8章 goroutine和信道 217
8.1 goroutine 217
8.2 示例:并发时钟服务器 219
8.3 示例:并发回声服务器 222
8.4 信道 225
8.5 并行循环 234
8.6 示例:并发Web爬虫 239
8.7 使用select实现多工 244
8.8 示例:并发目录遍历 247
8.9 取消执行 251
8.10 示例:聊天服务器 253
第9章 使用共享变量实现并发 257
9.1 竞险 257
9.2 互斥量:sync.Mutex 262
9.3 读写互斥量:sync.RWMutex 266
9.4 内存同步 267
9.5 缓式初始化:sync.Once 268
9.6 竞险检测器 271
9.7 示例:并发无阻塞式高速缓存 272
9.8 goroutine和线程 280
第10章 包和go工具 283
10.1 概述 283
10.2 导入路径 284
10.3 包声明 285
10.4 导入声明 285
10.5 空导入 286
10.6 包和命名 289
10.7 go工具 290
第11章 测试 301
11.1 go test工具 302
11.2 测试函数 302
11.3 覆盖率 318
11.4 性能基准函数 321
11.5 性能剖析 323
11.6 示例函数 326
第12章 反射 329
12.1 为什么会引入反射概念 329
12.2 reflect.Type和reflect.Value 330
12.3 递归值输出Display 333
12.4 示例:对S-表达式编码 338
12.5 使用reflect.Value给变量设置值 341
12.6 示例:对S-表达式解码 344
12.7 访问结构体域标签 348
12.8 列出类型的方法 351
12.9 几句忠告 352
第13章 低阶程序设计 353
13.1 unsafe.Sizeof、Alignof和Offsetof 354
13.2 unsafe.Pointer 356
13.3 示例:深等价 358
13.4 使用cgo调用C代码 361
13.5 再来几句忠告 366


1. Tutoria 1
1.1. Hello, World1
1.2. Command L ineArguments 4
1.3. FindingDup lic ateLines 8
1.4. Animated GIFs 13
1.5. FetchingaURL 15
1.6. FetchingURLs Con cur rently17
1.7. AWe bServer 19
1.8. Loose End s232.
2. ProgramStr ucture27
2.1. Names 27
2.2. Declarat ions 28
2.3. Var iables 30
2.4. Assig nments 36
2.5. Typ eDecl arat ions 39
2.6. Packages andFiles 41
2.7. Scope 45
3. Basic Data Typ es51
3.1. Int egers 51
3.2. Float ing Point Numbers 56
3.3. Complex Numbers 61
3.4. Boole ans63
3.5. Str ings64
3.6. Con stants75
4. Com positeTyp es81
4.1. Arrays 81
4.2. Slices 84
4.3. Maps 93
4.4. Str ucts99
4.5. JSON107
4.6. Text andHTMLTempl ates113
5. Func tions 119
5.1. FunctionDeclarat ions 119
5.2. Rec ursio 121
5.3..MultipleReturn Values.124
5.4..Errors 127
5.5..FunctionValues.132
5.6..Anonymous Functions.135
5.7..Variadic.Functions.142
5.8..Deferred.FunctionCalls 143
5.9..Panic.148
5.10..Recover 151
6..Methods 155
6.1..Method.Declarations.155
6.2..MethodswithaPointerReceiver 158
6.3..ComposingTypesby.Struct.Embedding 161
6.4..Method.Values.andExpressions.164
6.5..Example:.Bit.Vector.Type 165
6.6..Encapsulation 168

7..Interfaces 171
7.1..Interfaces.as.Contracts 171
7.2..Interface.Types 174
7.3..Interface.Satisfaction 175
7.4..ParsingFlags.withflag.Value 179
7.5..Interface.Values.181
7.6..Sortingwithsort.Interface 186
7.7..The http.Handler Interface.191
7.8..The error Interface.196
7.9..Example:.ExpressionEvaluator 197
7.10..Type Assertions.205
7.11..DiscriminatingErrorswith.TypeAssertions.206
7.12..QueryingBehaviorswith.Interface.TypeAssertions.208
7.13..Type Switches 210
7.14..Example:.Token-Based.XML.Decoding 213
7.15..AFew Words.ofAdvice.216
8..Goroutines.and.Channels.217
8.1..Goroutines 217
8.2..Example:.ConcurrentClockServer.219
8.3..Example:.ConcurrentEcho Server.222
8.4..Channels 225
8.5..Looping.inParallel 234
8.6..Example:.ConcurrentWeb.Crawler 239
8.7..Multiplexingwithselect 244
8.8..Example:.ConcurrentDirectoryTraversal 247
8.9..Cancellation 251
8.10..Example:.ChatSer.ver.253
9..Concurrency.withShared.Vari.ables 257
9.1..Race.Con.dit.ion.s 257
9.2..Mut.ual.Exc.lusion:sync.Mutex 262
9.3..Read/Write.Mut.exes:sync.RWMutex 266
9.4..Memor.ySy.nchro.nizat.ion 267
9.5..Lazy.Initializat.ion:sync.Once 268
9.6..TheRace.Detec.tor.271
9.7..Example:.Con.cur.rentNon-Blo.cking.Cache.272
9.8..Goroutinesand.Threads.280
10..Pack.ages and.the.GoTool 283
10.1..Int.roduc.tion 283
10.2..Imp.ort.Pat.hs 284
10.3..ThePackageDeclarat.ion 285
10.4..Imp.ort.Declarat.ions.285
10.5..Blank.Imp.orts 286
10.6..Packages.andNaming 289
10.7..TheGoTool 290
11..Testing.301
11.1..The go.test To.ol 302
11.2. Test Func.tions.302
11.3..Cov.erage 318
11.4. Benchmark Func.tions.321
11.5..Pro.ling 323
11.6. Example Func.tions.326
12..Re.ecti.on 329
12.1..Why.Re.ec.tion 329
12.2. reflect.Type and reflect.Value 330
12.3. Display,aRec.ursiveValue.Print.er 333
12.4..Example:.Enco.dingS-E.xpressions.338
12.5..Setting.Var.iables.wit.hreflect.Value 341
12.6..Example:.DecodingS-E.xpressions.344
12.7..AccessingStr.uct.Field.Tags.348
12.8..Displaying.the.Met.hodsofaTyp.e 351
12.9..AWo.rdofCaution.352
13..Low-L.evel.Pro.gramming 353
13.1. unsafe.Sizeof, Alignof,and Offsetof 354
13.2. unsafe.Pointer 356
13.3..Example:.DeepEquivalence.358
13.4..Cal.lingCCodewit.hcgo 361
13.5..Another.WordofCaution.366

教学资源推荐
作者: [美]本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup)著
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
作者: 陈帆 和红杰 周荣辉
作者: [美] 艾伦 A. A. 多诺万(Alan A. A. Donovan),布莱恩 W. 柯尼汉(Brian W. Kernighan)著
参考读物推荐