新書推薦:
《
宽容是件奢侈品(人生360度·一分钟经典故事)
》
售價:NT$
203.0
《
甲骨拼合六集
》
售價:NT$
1520.0
《
视觉美食家:商业摄影实战与创意解析
》
售價:NT$
602.0
《
中国经济发展的新阶段:机会与选择
》
售價:NT$
454.0
《
DK月季玫瑰百科
》
售價:NT$
959.0
《
为你想要的生活
》
售價:NT$
301.0
《
关键改变:如何实现自我蜕变
》
售價:NT$
352.0
《
超加工人群:为什么有些食物让人一吃就停不下来
》
售價:NT$
454.0
|
編輯推薦: |
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语言的世界
第1章 初识Go语言2
1.1 Go语言特性一瞥2
1.2 Go语言的优劣3
1.3 怎样学习Go语言4
1.4 本章小结5
第2章 Go语言环境搭建6
2.1 安装和设置6
2.1.1 Linux6
2.1.2 Windows9
2.2 工程结构10
2.2.1 工作区10
2.2.2 GOPATH11
2.2.3 源码文件11
2.2.4 代码包14
2.3 标准命令概述17
2.4 本章小结18
第二部分 编程基础
第3章 词法与数据类型20
3.1 基本词法20
3.1.1 标识符21
3.1.2 关键字22
3.1.3 字面量23
3.1.4 类型24
3.1.5 操作符26
3.1.6 表达式33
3.2 数据类型43
3.2.1 基本数据类型44
3.2.2 数组48
3.2.3 切片52
3.2.4 字典61
3.2.5 函数和方法64
3.2.6 接口72
3.2.7 结构体76
3.2.8 指针84
3.2.9 数据初始化87
3.3 数据的使用90
3.3.1 赋值语句90
3.3.2 常量与变量93
3.3.3 可比性与有序性101
3.3.4 类型转换108
3.3.5 内建函数114
3.4 本章小结118
第4章 流程控制方法119
4.1 基本流程控制119
4.1.1 代码块和作用域119
4.1.2 if语句121
4.1.3 switch语句124
4.1.4 for语句129
4.1.5 goto语句137
4.2 defer语句141
4.3 异常处理145
4.3.1 error146
4.3.2 panic和recover149
4.4 实战演练——Set154
4.5 实战演练——Ordered Map163
4.6 本章小结173
第5章 程序测试和文档174
5.1 程序测试174
5.1.1 功能测试174
5.1.2 基准测试180
5.1.3 样本测试187
5.1.4 测试运行记录189
5.1.5 测试覆盖率193
5.2 程序文档201
5.3 本章小结205
第三部分 并发编程
第6章 并发编程综述208
6.1 并发编程基础208
6.1.1 串行程序与并发程序209
6.1.2 并发程序与并行程序209
6.1.3 并发程序与并发系统210
6.1.4 并发程序的不确定性210
6.1.5 并发程序内部的交互210
6.2 多进程编程211
6.2.1 进程211
6.2.2 关于同步217
6.2.3 管道222
6.2.4 信号228
6.2.5 Socket238
6.3 多线程编程260
6.3.1 线程261
6.3.2 线程的同步268
6.4 多线程与多进程285
6.5 多核时代的并发编程286
6.6 Go语言的并发编程290
6.6.1 线程实现模型290
6.6.2 调度器299
6.6.3 更多的细节311
6.7 本章小结315
第7章 Goroutine和Channel316
7.1 Goroutine的使用316
7.1.1 go语句与Goroutine316
7.1.2 Goroutine的运作过程321
7.1.3 runtime包与Goroutine322
7.1.4 Happens Before326
7.2 Channel327
7.2.1 Channel是什么328
7.2.2 单向Channel335
7.2.3 for语句与Channel342
7.2.4 select语句344
7.2.5 非缓冲的Channel352
7.2.6 time包与Channel358
7.3 实战演练——载荷发生器363
7.3.1 参数和结果364
7.3.2 基本结构365
7.3.3 初始化369
7.3.4 启动和停止376
7.3.5 调用器和功能测试389
7.4 本章小结401
第8章 同步402
8.1 锁的使用402
8.2 条件变量411
8.3 原子操作414
8.4 只会执行一次420
8.5 WaitGroup423
8.6 临时对象池426
8.7 实战演练——Concurrent Map429
8.8 本章小结436
第四部分 编程实战
第9章 一个网络爬虫框架的设计和实现438
9.1 网络爬虫与框架438
9.2 功能需求和分析440
9.3 总体设计441
9.4 详细设计443
9.4.1 基本数据结构443
9.4.2 接口的设计449
9.5 中间件的实现459
9.5.1 通道管理器460
9.5.2 实体池470
9.5.3 停止信号477
9.5.4 ID生成器480
9.6 处理模块的实现482
9.6.1 网页下载器483
9.6.2 分析器488
9.6.3 条目处理管道494
9.7 调度器的实现498
9.7.1 基本结构499
9.7.2 主要的函数和方法502
9.7.3 请求缓存521
9.7.4 摘要信息的类型524
9.8 一个使用演示530
9.8.1 再看调度器参数530
9.8.2 开启调度器535
9.8.3 调度器监控函数542
9.9 当前的不足和解决思路552
9.10 本章小结555
附录 Go语言的学习资源557
|
內容試閱:
|
前言
很高兴你能选择这本书。希望这本书能够让你成为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的项目中。读者可以访问https:github.comhyper-carrotgoc2p下载它。该项目的根目录的路径应该被包含在环境变量GOPATH中。如果你不了解Git(一款代码版本控制工具),请在互联网中搜索“git”并获取相关信息。
关于勘误
由于时间水平都比较有限,所以书中难免会出现一些纰漏和错误。如果大家发现了一些问题,请及时指正。我也会尽快在本书后续的版本中加以改正。我专为本书设立的电子邮箱是:hypermind.cn@gmail.com。我的微博是:特价萝卜。我欢迎也希望和大家一起学习和讨论Go语言,并共同推动Go语言中国社区的发展。
致谢
撰写图书是一项需要大量精力和一定毅力的工作,尤其是编写技术图书,更需要作者对相关知识进行深入的梳理和系统的整合,还需要制作各种图表,编写各种示例。对于个人而言,工作量确实是不小的。但是,这个写作过程也是有趣的,通过写作我也收获了很多。当然,很多收获是来自他人的传授。其中,图灵公司的编辑王军花、张霞以及傅志红老师都给予了我很大的帮助,尤其是在写作技巧和图书结构方面。此外,还有目前中国业内公认的Go语言专家许式伟、谢孟军等,我在编写本书的时候经常向他们讨教。在此,我对这些帮助过我的专家和同行表示由衷的感谢。同时,我也要感谢我的家人。没有他们的支持和理解,我不可能在有限的业余时间里完成这本书。
|
|