重磅推荐
【编辑推荐】
1. 全面介绍Go语言基础编程。本书通过5个章节详细地介绍了Go的语言细节和底层实现细节,贯穿于语言层面和源码层面,让读者可以对Go语言的实现有更加深刻的理解。
  2. 直击Go语言的精髓和**亮点——并发编程技术。本书**的看点和特色在于并发编程。本书深入剖析了并发编程模型及其在多个编程实战中的应用,重点阐述了Go语言并发编程模型和机制,详细介绍了Go并发编程的核心要素——Goroutine和Channel的概念、原理、基本用法和高级技巧应用,以及编写并发程序的过程中对各种同步工具的运用等问题。
  3. 示例全面详细。本书展示和细致讲解了各种各样的代码实例,尤其是包含了像载荷发生器和网络爬虫框架这样的实用程序,让读者可以对并发、线程、信号等概念有清晰的理解。
【内容简介】
本书全面介绍了Go语言的特点、安装部署环境、工程规范、工具链、语言语法、并发编程模型以及在多个编程实战中的应用,重点阐述了Go语言并发编程模型和机制。本书共分为四个部分,介绍了Go语言编程环境搭建、Go语言基础编程、Go语言并发编程方法及其原理,以及使用Go语言开发的应用系统的案例讲解。
  本书适用于有一定计算机编程基础的从业者以及对Go语言编程感兴趣的爱好者,非常适合作为Go语言编程进阶教程。
【作者简介】
郝林
  Gopher、高级Java软件工程师、Python程序员和Linux爱好者。目前在宜信公司的小微企业增值服务中心任软件系统架构师。曾就职于搜狐网多年,并任Java项目经理。在互联网软件的设计和开发方面拥有丰富的实战经验。微博名:特价萝卜。
【媒体评论】
“并发编程的支持无疑是Go语言*的亮点。但是,尽管Go语言大幅降低了并发编程的门槛,但至今大部分开发者对如何运用该语言编写高并发程序的认知仍然有限。我很高兴能有一本专门探讨Go语言并发编程的书。《Go并发编程实战》这本书对Go语言并发编程的探讨之深入、讲解之细腻是它的一大亮点。同时,这本书也非常适合作为Go语言的入门教材,即便是对Go语言了解不深甚至从未接触的人也能从中获益。另外,书中的示例也非常有价值,它们贴切地展现了用Go语言进行编程的方法和技巧。总之,《Go并发编程实战》是一份难得的Go语言学习资料。”
  ——许式伟,七牛云存储CEO
  “Go语言作为优秀的开源编程语言,已逐渐成为云计算时代的必学语言之一。《Go并发编程实战》不但对基本的Go语言编程方法和技巧进行了深入的阐释,还独树一帜地对Go语言的内部机制和原理进行了清晰的描述。这些都是学好和用好Go语言的极佳资料。推荐Go语言爱好者以及对Go语言感兴趣的技术人员都阅读这本书。”
  ——杜玉杰,中国OpenStack社区(COSUG)发起人,OpenStack基金会董事,企业级云计算联盟(ECA)副秘书长
  “Go语言是服务端编程领域非常热门的语言,市面上关于Go语言的图书并不少见,但都没有像《Go并发编程实战》这样,把Go语言*精髓的部分——并发编程讲解得如此深入浅出,明白透彻。本书系统地梳理了并发编程的概念和原理,并辅以详细的Go语言程序示例,非常容易让读者对并发、线程、信号等概念有清晰的理解。不管你是*次接触Go语言,还是已经非常熟悉它了,如果想了解Go语言更多的技术内幕,这本书都值得仔细研读,相信读者能够从中受益匪浅。”
  ——郭理靖,**云平台开放云事业部总监
  “Go语言从诞生之日起就充满了争议,但是社区对它的热情却越来越高,今年InfoWorld*的开源项目Docker就是用Go写的,可见Go闪烁着越来越耀眼的光芒。郝林的这本书非常注重对Go编程细节的清晰阐释,这在国内原创技术书中是不多见的。书中示例选取精心得当,深入浅出,完全没有那种看完仍需要参悟的感觉。这是一本Go学习者真正需要的图书。”
  ——程显峰,蓝海讯通COO,《MongoDB权威指南》译者
  “Go语言之所以被称为21世纪的C语言,不仅在于它精简的语法和高效的开发,更在于它具有原生支持和易于使用的高并发的特性。而越是简单的技术就越能够生成千变万化的组合,想要用到极致,需要对它有深刻的见解。在《Go并发编程实战》一书中,作者由浅入深地对Go并发技术进行了剖析,并辅以翔实的案例,让读者真正了解和掌握Go并发编程,成为多核时代和云计算时代的开发尖兵。”
  ——陈佳桦,Go语言签约讲师,Gogs项目创始人
【目录】
部分 Go语言的世界
 第1章 初识Go语言
  1.1 Go语言特性一瞥
  1.2 Go语言的优劣
  1.3 怎样学习Go语言
  1.4 本章小结
 第2章 Go语言环境搭建
  2.1 安装和设置
   2.1.1 Linux
   2.1.2 Windows
  2.2 工程结构
   2.2.1 工作区
   2.2.2 GOPATH
   2.2.3 源码文件
   2.2.4 代码包
  2.3 标准命令概述
  2.4 本章小结
第二部分 编程基础
 第3章 词法与数据类型
  3.1 基本词法
   3.1.1 标识符
   3.1.2 关键字
   3.1.3 字面量
   3.1.4 类型
   3.1.5 操作符
   3.1.6 表达式
  3.2 数据类型
   3.2.1 基本数据类型
   3.2.2 数组
   3.2.3 切片
   3.2.4 字典
   3.2.5 函数和方法
   3.2.6 接口
   3.2.7 结构体
   3.2.8 指针
   3.2.9 数据初始化
  3.3 数据的使用
   3.3.1 赋值语句
   3.3.2 常量与变量
   3.3.3 可比性与有序性
   3.3.4 类型转换
   3.3.5 内建函数
  3.4 本章小结
 第4章 流程控制方法
  4.1 基本流程控制
   4.1.1 代码块和作用域
   4.1.2 if语句
   4.1.3 switch语句
   4.1.4 for语句
   4.1.5 goto语句
  4.2 defer语句
  4.3 异常处理
   4.3.1 error
   4.3.2 panic和recover
  4.4 实战演练——Set
  4.5 实战演练——Ordered Map
  4.6 本章小结
 第5章 程序测试和文档
  5.1 程序测试
   5.1.1 功能测试
   5.1.2 基准测试
   5.1.3 样本测试
   5.1.4 测试运行记录
   5.1.5 测试覆盖率
  5.2 程序文档
  5.3 本章小结
第三部分 并发编程
 第6章 并发编程综述
  6.1 并发编程基础
   6.1.1 串行程序与并发程序
   6.1.2 并发程序与并行程序
   6.1.3 并发程序与并发系统
   6.1.4 并发程序的不确定性
   6.1.5 并发程序内部的交互
  6.2 多进程编程
   6.2.1 进程
   6.2.2 关于同步
   6.2.3 管道
   6.2.4 信号
   6.2.5 Socket
  6.3 多线程编程
   6.3.1 线程
   6.3.2 线程的同步
  6.4 多线程与多进程
  6.5 多核时代的并发编程
  6.6 Go语言的并发编程
   6.6.1 线程实现模型
   6.6.2 调度器
   6.6.3 更多的细节
  6.7 本章小结
 第7章 Goroutine和Channel
  7.1 Goroutine的使用
   7.1.1 go语句与Goroutine
   7.1.2 Goroutine的运作过程
   7.1.3 runtime包与Goroutine
   7.1.4 Happens Before
  7.2 Channel
   7.2.1 Channel是什么
   7.2.2 单向Channel
   7.2.3 for语句与Channel
   7.2.4 select语句
   7.2.5 非缓冲的Channel
   7.2.6 time包与Channel
  7.3 实战演练——载荷发生器
   7.3.1 参数和结果
   7.3.2 基本结构
   7.3.3 初始化
   7.3.4 启动和停止
  7.3.5 调用器和功能测试
  7.4 本章小结
 第8章 同步
  8.1 锁的使用
  8.2 条件变量
  8.3 原子操作
  8.4 只会执行一次
  8.5 WaitGroup
  8.6 临时对象池
  8.7 实战演练——Concurrent Map
  8.8 本章小结
第四部分 编程实战
 第9章 一个网络爬虫框架的设计和实现
  9.1 网络爬虫与框架
  9.2 功能需求和分析
  9.3 总体设计
  9.4 详细设计
   9.4.1 基本数据结构
   9.4.2 接口的设计
  9.5 中间件的实现
   9.5.1 通道管理器
   9.5.2 实体池
   9.5.3 停止信号
   9.5.4 ID生成器
  9.6 处理模块的实现
   9.6.1 网页下载器
   9.6.2 分析器
   9.6.3 条目处理管道
  9.7 调度器的实现
   9.7.1 基本结构
   9.7.2 主要的函数和方法
   9.7.3 请求缓存
   9.7.4 摘要信息的类型
  9.8 一个使用演示
   9.8.1 再看调度器参数
   9.8.2 开启调度器
   9.8.3 调度器监控函数
  9.9 当前的不足和解决思路
  9.10 本章小结
附录 Go语言的学习资源
【免费在线读】
前  言
  很高兴你能选择这本书。希望这本书能够让你成为Go粉。很多Go语言爱好者都喜欢称自己是Gopher。
  Go编程语言(或称Golang,以下简称Go语言)是云计算时代的C语言。它的诞生是为了让程序员有更高的生产效率,并让程序在有并行计算支持的环境下更快速地运行。2009年11月10日,Go语言正式成为开源编程语言大家庭的一员。在本书截稿之时,它的版本是1.3。因此,本书的内容和相关代码将会围绕Go语言的1.3版本展开。
  这里所说的开源是指开放源代码。开源不仅仅意味着分享和免费。对于软件开发人员来讲,它更多的是代表着一种协同工作的方式。它可以使不同公司、不同城市甚至不同国家的技术爱好者们聚集起来,以共同分享和使用源代码的方式协同完成一个任务或目标。开源的意义并不在于目标大小,而在于对某个技术领域、某个应用行业甚至整个产业的启示和推动力。开源的编程语言会更多、更好地凝聚众人的力量,并使它更快地奔向成功。
  Go语言每半年就会发布一个大版本升级(比如从1.1升级到1.2、从1.2升级到1.3,等等)。这样的更新速度是很多其他编程语言望尘莫及的。其中,开源无疑起到了很大的推动作用。
  Go语言虽然在2009年才真正成为开源编程语言,在2012年才发布个正式版——1.0版本,但是它很早就进入了中国软件开发者的视野。这不单单是因为它是由几位教父级软件开发先驱开发、由Google公司发布的开源编程语言,更是因为它是一门拥有诸多先进特性、拥有高性能和生产效率、为云计算时代和软件工程而生的多范式编程语言。Go语言虽然年轻,但已经足以用于软件生产。
  目前来看,Go语言在中国发展的不足就是其开源社区非常松散,爱好者不论是在地理位置上还是在互联网络中都比较分散。当然,这也是由于Go语言的年轻所导致的。目前,在中国没有一个可以主导语言爱好者学习和交流的Go语言社区,语言爱好者的数量也相对较少。它不像Python那样,在中国有一个统一的、分支众多的语言爱好者联盟,Python语言爱好者可以很轻易地找到志同道合的组织和同行,并积极地进行分享和交流。Go语言在这方面有所缺失的很大一部分原因是在中国使用Go语言的软件开发者太少。因此,我非常希望能通过本书使更多的同行了解和使用Go语言,并用它来创造更多的价值。我也希望大家能够协力共建中国的Go语言技术社区。
  通过本书,我会带领大家进入Go语言的世界,领略Go语言的魅力,为大家打开一扇门,也力求使大家对使用Go语言开发软件产生更多的兴趣。
  本书结构
  本书共分为四个部分。
  部分,将会带领你进入Go语言的世界,让你对Go语言有个基本的了解,这一部分包含两章。
  第1章,会简要介绍Go语言为大家带来的优秀特性和新鲜活力,以及与其他主流编程语言相比的优缺点。
  第2章,将对编写和运行Go语言程序所需的所有前期工作进行说明。这包括安装和配置方法、工程结构以及标准命令。通过对这些知识的学习和实践,相信读者就可以为编写Go代码和建立Go项目做好准备了。
  第二部分,会详细阐述Go语言的基础编程知识,这一部分包含了3章。
  第3章,首先会介绍Go语言中的关键字、运算符、类型、表达式等基本的概念。掌握这些知识,读者可以了解到Go语言在代码构建方面的言简意赅。然后,展示Go语言基本数据结构及其主要操作方法和技巧。Go语言的基本数据结构的操作方式是非常脚本化的,使用起来也非常简单和方便。后,我将加入一些相对高级一点的主题,比如基本数据结构的初始化方式、可比性与有序性,以及类型转换方式等,从中我们会看到Go语言的设计者们在灵活性和简洁性之间做出的取舍。
  第4章,我们一起来学习Go语言的流程控制方法。这些方法已经足以体现出Go语言的先进和强大(当然,我们在后面还会看到更棒的特性)。这一章不但会介绍Go语言中基本的逻辑控制方法,还会深入阐述Go语言特有的程序编写方式,以及这些特有方式所体现出的Go语言程序设计哲学。
  第5章,将详细介绍Go语言程序的测试和文档的编写。
  第三部分,将集中笔墨讲解Go语言中强悍的部分——并发编程的概念和知识,这一部分同样包含了3章的内容。
  第6章,先简要介绍与多进程编程和多线程编程有关的知识。这些知识会作为理解Go语言并发编程模型的先导内容展现给大家。看过以后,大家应该可以对并发编程有一个比较清晰的理解。同时,还会指出以内存共享为基础的并发编程方式所带来的一些问题。后,通过剖析多核时代(基于多CPU核心的计算时代)的并发编程需求,引出Go语言先进的并发编程模型。大家会看到Go语言为之做出的努力。
  第7章,会向大家展示Go特有的编程要素——Goroutine(也可称为Go程)的魅力。这一章不但会介绍怎样利用Goroutine编写可并发运行的程序,还会深入阐述Goroutine背后的运作机理和执行过程,使读者知其然更知其所以然。此外,还会介绍标准库的runtime代码包中与Goroutine相关的一些API。这一章的另一个重点是对Go语言并发编程中不可或缺的部分——Channel的介绍。Channel与Goroutine堪称绝配,它的用法相当灵活。这一章在介绍了Channel的基本概念和使用规则之后,还会介绍多种Channel的实际用法,并通过丰富的示例来说明每种使用方法和技巧。后,还描述了标准库的time代码包中的API是如何通过Channel来实现其强大功能的。
  第8章,将是对Go语言提供的传统同步和互斥方法的介绍。这包括锁、条件变量、原子操作、WaitGroup、临时对象池,等等。这些同步方法的提供者大都是标准库的sync代码包。虽然Go语言官方并不推荐使用这些方式来控制和协调Go语言编写的并发程序,但不容忽视的是,它们确实在一些应用场景中是简单有效的。
  第四部分仅包含一章,即第9章。
  第9章,包括了一个基本囊括本书前三个部分所涉及的全部概念和知识的完整示例。我会带领大家一步一步地编写这个示例。在这个过程中,我会进一步阐述Go语言的哲学和理念,以及我在多年编程生涯中的一些见解和感悟。大家可以通过对这个示例的学习来巩固我们之前讲到的Go语言知识,并加深对Go语言并发编程的理解。
  在本书的附录中,将向大家简单介绍目前在国内外比较活跃的一部分Go语言开源项目和Go语言社区。这会使大家学习Go语言的道路变得更加顺畅,也有利于大家找到志同道合的朋友。
  目标读者
  原则上来讲,任何对计算机编程和Go语言感兴趣的人都可以阅读本书。但是,当你学习一门编程语言的时候,往往还是需要有些许基础的。比如,怎样使用文本编辑器,怎样在相应的操作系统中安装软件,等等。并且,要想成为一名高级的Go软件工程师,你需要了解的周边知识可能在数量上会比Go语言编程本身多出几倍甚至几十倍。这就像摘苹果一样,如果要摘到苹果,就需要徒手爬上果树,或者找到工具帮助你;如果想摘到果树甜的那个苹果,就需要花费更多的时间和精力,爬过更多的枝叶。希望本书能成为帮助你摘苹果的工具。但是,你还是需要先活动活动手脚的,毕竟后享用苹果的是你而不是梯子或者其他什么东西。在想有所收获之前,请先潜心地学习和积累。
  我在这里列出了一些你可能需要爬过的枝叶。
  知道计算机系统是什么,以及它的核心是由哪些部件组成的。比如,CPU是什么?它是做什么用的?
  知道软件是什么,以及它们是怎么设计和开发出来的。比如,操作系统和网络浏览器都是软件吗?
  了解一些基本的Linux操作系统知识。比如,在命令行(也被称为终端)环境中怎样进入一个目录?怎样查看一个文本文件?
  使用过一两门编程语言,真正编写过程序或软件。当然,没有也没关系,因为Go语言很适合作为计算机编程的入门语言。
  当然,以上这些仅供参考。你在阅读本书的过程中边看边学也完全没问题,甚至可以看完本书再去学习相关知识。采用哪种学习方式完全取决于你自己。
  关于示例代码
  我会把本书涉及的所有Go示例代码(也许不只,可能会有小惊喜)都放到一个名为goc2p的项目中。该项目的根目录的路径应该被包含在环境变量GOPATH中。如果你不了解Git(一款代码版本控制工具),请在互联网中搜索“git”并获取相关信息。
  关于勘误
  由于时间水平都比较有限,所以书中难免会出现一些纰漏和错误。如果大家发现了一些问题,请及时指正。我也会尽快在本书后续的版本中加以改正我欢迎也希望和大家一起学习和讨论Go语言,并共同推动Go语言中国社区的发展。
  致谢
  撰写图书是一项需要大量精力和一定毅力的工作,尤其是编写技术图书,更需要作者对相关知识进行深入的梳理和系统的整合,还需要制作各种图表,编写各种示例。对于个人而言,工作量确实是不小的。但是,这个写作过程也是有趣的,通过写作我也收获了很多。当然,很多收获是来自他人的传授。其中,图灵公司的编辑王军花、张霞以及傅志红老师都给予了我很大的帮助,尤其是在写作技巧和图书结构方面。此外,还有目前中国业内公认的Go语言专家许式伟、谢孟军等,我在编写本书的时候经常向他们讨教。在此,我对这些帮助过我的专家和同行表示由衷的感谢。同时,我也要感谢我的家人。没有他们的支持和理解,我不可能在有限的业余时间里完成这本书。

返回顶部