《Go并发编程实战(第2版)》试读:前  言

很高兴你能选择这本已经过大量改进的书,希望本书能够让你成为真正的Go粉。很多Go语言爱好者都喜欢称自己是Gopher,这是一个来自官方的传统,希望你也能这样称呼自己。 Go编程语言(或称Golang,以下简称Go语言)是云计算时代的C语言。7年过去了,它渐渐向世人证明此言不虚。如果你关注TIOBE的编程语言排行榜就会发现,Go语言从前些年的第50多位,经过多次上窜已经跃居第13位,跻身绝对主流的编程语言行列!同时,它还被评为2016年的年度语言!经过了数年的不断改进,Go语言在开发效率和程序运行效率方面又上了数个台阶。 下面我简单列举一下它在最近两年比较显而易见的变化。  本身的自举。也就是说,Go语言几乎完全用Go语言程序重写了自己,仅留有一些汇编程序。Go语言的自举非常彻底,包括了最核心的编译器、链接器、运行时系统等。现在任何学习Go语言的人都可以直接读它的源代码了。此变化也使Go程序的跨平台编译变得轻而易举。  运行时系统的改进。这主要体现在更高效的调度器、内存管理以及垃圾回收方面。调度器已能让goroutine更及时地获得运行时机。运行时系统对内存的利用和控制也更加精细了。因垃圾回收而产生的调度停顿时间已经小于原来的1‰。另外,最大P数量的默认值由原先的1变为与当前计算机的CPU核心数相同。  标准工具的增强。在Go 1.4加入go generate之后,一个惊艳的程序调试工具go tool trace也被添加进来了。另外,go tool compile、go tool asm和go tool link等工具也已到位;一旦你安装好Go,就可以直接使用它们。同时,几乎所有的标准工具和命令都得到了不同程度的改进。  访问控制的细化。这种细化始于Go 1.4,正式支持始于Go 1.5,至今已被广泛应用。经过细化,对于Go程序中的程序实体,除了原先的两种访问控制级别(公开和包级私有)之外,又多了一种——模块级私有。这是通过把名称首字母大写的程序实体放入internal代码包实现的。  vendor机制的支持。自Go 1.5之后,一个特殊的目录——vendor——被逐渐启用。它用于存放其父目录中的代码包所依赖的那些代码包。在程序被编译时,编译器会优先引用存于其中的代码包。这为固化程序的依赖代码迈出了很重要的一步。在Go 1.7中,vendor目录以及背后的机制被正式支持。 当然,上述变化并不是全部。它的标准库也经历了超多的功能和性能改进。如果你是在本书的第1版面市时开始学习Go语言的,那么一定能感受到这些变化带来的巨大红利。 从本书第1版出版至今,Go语言的版本号已经从1.4升至1.8,本书第2版就是基于Go 1.8写成的。 本书第2版根据Go语言本身的变化以及第1版读者的大量反馈做了很多改进,也重写了非常多的内容。你的第一感觉肯定是书变薄、变轻了!没错,最直观的改进就是书中几乎每个章节都更为精炼。在讲Go编程基础的时候,我只说明重点,并尽量用代码和表格代替文字,同时让它们变得易于速查。因此,本书在这方面的篇幅由5章缩减为了2章。然而,讲并发编程理念、方法和实战的部分却得到了适当的扩充。你可能已经发现,后面几章的内容非常多,这是因为我更加细致地讲解了那些核心知识。 同时,本书的所有示例程序都重新编排,变得更加有条理,更加容易查找。当然,我对示例程序本身也做了相当大的改造。首先是充分使用Go语言的新特性。比如,有的代码包拥有了自己的internal包。又比如,示例项目本身也用到了vendor目录。其次,更多的优质代码包被引入进来并充分利用,比如io/ioutil、context等。另外,还对一些关键示例进行了脱胎换骨的改写。比如,完全重写了ConcurrentMap,它的性能比原先的版本高出数倍。又比如,我对网络爬虫框架做了大幅更新,既包括较为底层的数据结构,也包括调度器以及一些模块的接口和实现。这使得它更易用、扩展性更好,同时代码中体现的技巧和理念也更多、更突出。因此,本书最后一章也几乎完全重写了。 本书结构 本书共分为6章。 第1章,快速介绍了Go语言的优秀特性、安装设置方法、工程结构以及标准命令和工具。 第2章,讲述了Go语言的语法基础、数据类型以及流程控制方法。 第3章,主要阐述了与多进程编程和多线程编程有关的知识。这些知识作为理解Go语言并发编程模型的先导内容。看过以后,你就可以对并发编程有一个比较清晰的理解。之后,本章还简要剖析了多核时代(基于多CPU核心的计算时代)的并发编程需求。 第4章,在深入展示和说明Go语言的并发编程模型之后,本章讲解Go特有的编程要素——goroutine(也可称为Go例程)的用法以及背后的运作机理。此外,本章还会对Go并发编程中另一个不可或缺的部分——channel进行重点介绍,包括概念、使用规则以及应用技巧。 第5章,会对Go语言提供的传统同步方法进行介绍。这包括互斥锁、条件变量、原子操作、WaitGroup、临时对象池等,这些同步方法大多是标准库代码包sync中的一员。虽然Go语言官方并不建议优先使用这些方式来保障程序的并发安全性,但不容忽视的是,它们在一些应用场景中确实简单有效。 第6章,包括一个基本囊括了本书所有概念和知识的完整示例——网络爬虫框架。我会带你逐步编写这个示例,并进一步阐述Go语言的哲学和理念,同时分享我在多年编程生涯中的一些见解和感悟。你可以通过这个示例来巩固前面学到的Go语言知识,并加深对Go并发编程的理解。 附录A,简单介绍目前在国内外比较活跃的一部分Go语言开源项目和Go语言社区,这会使你学习Go语言的道路变得更加顺畅,也有利于你找到志同道合的朋友。 目标读者 原则上来讲,任何对计算机编程和Go语言感兴趣的人都可以阅读本书。但是,当你学习一门编程语言的时候,往往还是需要有一些基础的。比如,怎样使用文本编辑器、怎样在相应的操作系统中安装软件,等等。而要想成为一名高级的Go软件工程师,你需要了解的知识可能比表面看上去的多很多。这就像摘苹果一样,如果要摘到苹果,就需要徒手爬上果树,或者找到足够高的梯子;如果想摘到果树顶端最甜的那个苹果,就需要花费更多的时间和精力,爬过更多的枝叶。希望本书能成为帮助你摘苹果的梯子。但是,在想有所收获之前,请先潜心学习和积累。 当然,你在阅读本书的过程中边看边学也完全没问题,甚至可以看完本书再去学习相关知识。采用哪种学习方式,这完全取决于你自己。 关于示例代码 我会把本书涉及的示例代码 都放到一个名为example.v2的项目中,你可以访问https://github.com/gopcp/example.v2查看或下载。你存放该项目目录的绝对路径应该包含在环境变量GOPATH中。如果你不了解Git(一款代码版本控制工具),请在网上搜索“git”并详细了解。 关于勘误 由于作者水平和时间有限,书中难免会有一些纰漏和错误,欢迎读者及时指正,本书后续印次或版本中将加以改正。非常希望和大家一起学习和讨论Go语言,并共同推动Go语言在中国的发展。你可以通过电子邮件(hypermind@outlook.com)联系我,也可以到图灵社区(iTuring.cn)本书主页上发表评论。 致谢 写书是一项需要大量精力和毅力的工作,尤其是编写技术图书,更需要作者对相关知识进行深入的梳理和系统的整合,还需要制作各种图表,编写各种示例,工作量确实不小。但是,这个写作过程也很有趣,我通过写作也收获了很多。当然,很多收获来自他人的传授。其中,图灵公司的编辑王军花和傅志红老师都给予了我很大的帮助,尤其是在写作技巧和图书结构方面。当然,还有目前中国业内公认的Go语言专家们,我在编写本书的时候经常向他们讨教。在此,谨对帮助过我的所有人表示由衷的感谢。同时也要感谢我的家人,没有他们的支持和理解,我不可能在有限的业余时间里完成本书。

>Go并发编程实战(第2版)

Go并发编程实战(第2版)
作者: 郝林
isbn: 7115452512
书名: Go并发编程实战(第2版)
页数: 370
定价: 79.00元
出版社: 人民邮电出版社
出版年: 2017-4
装帧: 平装