新書推薦:
《
500万次倾听:陪伤心的人聊聊
》
售價:NT$
245.0
《
英国商业500年(见证大国崛起与企业兴衰,启迪未来商业智慧。)
》
售價:NT$
367.0
《
万千心理·儿童心理治疗中的心智化:临床实践指导
》
售價:NT$
398.0
《
自我囚禁的人:完美主义的心理成因与自我松绑(破除你对完美主义的迷思,尝试打破自我评价过低与焦虑的恶性循环)
》
售價:NT$
301.0
《
周易
》
售價:NT$
203.0
《
东南亚的传统与发展
》
售價:NT$
306.0
《
乾隆制造
》
售價:NT$
398.0
《
资治通鉴臣光曰辑存 资治通鉴目录(司马光全集)(全二册)
》
售價:NT$
1316.0
|
編輯推薦: |
基于Go语言源码提炼Go特性的实现原理,配以大量图表和实例。
详解常见数据结构实现原理,常见控制结构实现原理,Go协程、内存管理、反射等机制,Go 工具链指导及原理。
分享由实际项目Bug复盘而来的案例,包括定时器资源泄露、语法糖陷阱等。
包含大量练习题目,可以作为面试题目来源。
|
內容簡介: |
本书深入地讲解了Go语言常见特性的内部机制和实现方式,大部分内容源自对Go语言源码的分析,并从中提炼出实现原理。通过阅读本书,读者可以快速、轻松地了解Go语言的内部运作机制。
本书首先介绍Go语言常见的数据结构及控制结构的实现原理,包括管道、切片、Hash表、select和for-range等,这部分内容大都以几个精心准备的测验题目开头,每个测验题目均对应一个知识点,读者可以借此测验自身对该知识点的掌握程度。接着介绍了Go语言*基础的概念,包括协程的概念、协程调度模型、协程调度策略,以及内存分配和垃圾回收相关的内容。本书还介绍了一些标准库、异常处理和依赖管理等非语法相关但非常重要的内容。*后结合作者的见闻,整理了一些发生在真实项目中的编程陷阱。
|
關於作者: |
华为云原生团队核心成员,开源爱好者,深度参与CNCF(云原生计算基金会)旗下Kubernetes、Prometheus等项目贡献,Kubernetes资深成员,担任Kubernetes SIG-Instrumentation Approver,敏捷软件思想深度实践者,在Nokia、华为等公司参与过多个大型项目的研发与重构,对Go、CC 、Python、Swift等语言均有深入的研究与实践。
|
目錄:
|
目录
第1章 常见数据结构的实现原理
1.1 管道
1.1.1 热身测验
1.1.2 特性速览
1.1.3 实现原理
1.2 slice
1.2.1 热身测验
1.2.2 特性速览
1.2.3 实现原理
1.2.4 切片表达式
1.3 map
1.3.1 热身测验
1.3.2 特性速览
1.3.3 实现原理
1.4 struct
1.4.1 热身测验
1.4.2 内嵌字段
1.4.3 方法受体
1.4.4 字段标签
1.5 iota
1.5.1 热身测验
1.5.2 特性速览
1.5.3 实现原理
1.6 string
1.6.1 热身测验
1.6.2 特性速览
1.6.3 实现原理
第2章 控制结构
2.1 select
2.1.1 热身测验
2.1.2 特性速览
2.1.3 实现原理
2.2 for-range
2.2.1 热身测验
2.2.2 特性速览
2.2.3 实现原理
第3章 协程
3.1 协程的概念
3.2 调度模型
3.3 调度策略
第4章 内存管理
4.1 内存分配
4.2 垃圾回收
4.3 逃逸分析
第5章 并发控制
5.1 channel
5.2 WaitGroup
5.3 context
5.4 Mutex
5.5 RWMutex
5.5.1 读写锁的数据结构
5.5.2 场景分析
第6章 反射
6.1 热身测验
6.2 接口
6.3 反射定律
第7章 测试
7.1 快速开始
7.1.1 单元测试
7.1.2 基准测试
7.1.3 示例测试
7.2 进阶测试
7.2.1 子测试
7.2.2 Main测试
7.3 实现原理
7.3.1 testing.common
7.3.2 testing.TB接口
7.3.3 单元测试的实现原理
7.3.4 性能测试的实现原理
7.3.5 示例测试的实现原理
7.3.6 Main测试的实现原理
7.3.7 go test的工作机制
7.4 扩展阅读
7.4.1 测试参数
7.4.2 benchstat
第8章 异常处理
8.1 error
8.1.1 热身测验
8.1.2 基础error
8.1.3 链式error
8.1.4 工程迁移
8.2 defer
8.2.1 热身测验
8.2.2 约法三章
8.2.3 实现原理
8.2.4 性能优化
8.3 panic
8.3.1 热身测验
8.3.2 工作机制
8.3.3 源码剖析
8.4 recover
8.4.1 热身测验
8.4.2 工作机制
8.4.3 源码剖析
第9章 定时器
9.1 一次性定时器(Timer)
9.1.1 快速开始
9.1.2 实现原理
9.2 周期性定时器(Ticker)
9.2.1 快速开始
9.2.2 实现原理
9.3 runtimeTimer
9.3.1 实现原理
9.3.2 性能优化
9.4 案例分享
第10章 语法糖
10.1 简短变量声明符
10.1.1 热身测验
10.1.2 规则
10.2 可变参函数
第11章 版本管理
11.1 安装Go
11.2 删除Go
11.3 升级Go
11.4 Go版本管理器
11.4.1 快速开始
11.4.2 工作机制
11.4.3 小结
11.5 源码编译
11.5.1 源码下载
11.5.2 源码编译过程
第12章 Go语言依赖管理
12.1 GOPATH
12.1.1 GOROOT是什么
12.1.2 GOPATH是什么
12.1.3 依赖查找
12.1.4 GOPATH的缺点
12.2 vendor
12.2.1 vendor目录位置
12.2.2 搜索顺序
12.2.3 vendor的不足
12.3 Go Module
12.3.1 Go Module基础
12.3.2 快速实践
12.3.3 replace指令
12.3.4 exclude指令
12.3.5 indirect指令
12.3.6 版本选择机制
12.3.7 incompatible
12.3.8 伪版本
12.3.9 依赖包存储
12.3.10 go.sum
12.3.11 模块代理
12.3.12 GOSUMDB的工作机制
12.3.13 GOSUMDB的实现原理
12.3.14 第三方代理
12.3.15 私有模块
12.3.16 Go Module的演进
第13章 编程陷阱
13.1 切片扩容
13.2 空切片
13.3 append的本质
13.4 循环变量引用
13.5 协程引用循环变量
13.6 recover失效
|
內容試閱:
|
前言
Go语言是由Google公司开源的一门编程语言,虽然正式历史只有短短10年不到(2012年发布1.0版本),但在多个领域尤其是云计算领域得到了快速及广泛的应用。相对于C这种底层系统语言,Go语言增加了自动垃圾回收、协程、接口等现代语言中常见的高级特性,而相对于Java、Python等应用开发语言,Go语言移除或弱化了泛型、类、元编程、Lambda表达式等高级特性。Go语言因此兼备了系统级语言所需要的轻快灵,以及应用级语言所需要的低门槛、高生产力。Go语言非常适合用于云服务开发、应用服务端开发,以及在通用Linux上的部分嵌入式系统开发。
Go语言的快速发展也离不开开源社区的支持。Go语言自开源起就引发了大量开发者的关注,并且基于Go语言诞生了大批知名的开源项目,其中最引人瞩目的无疑是Kubernetes、Docker,以及托管在CNCF(云原生计算基金会)旗下的大批云原生开源项目。Go语言也因此被称为云基础设施语言,Google公司的Go产品负责人更是称Go语言为云的语言。
在笔者所在的华为公司,Go语言被作为公司级的五种指定编程语言之一(其他四种为C、C 、Java、Python),并且在华为云云原生产品研发部门作为首选编程语言。华为云目前有多达30款以上的云服务产品以Go语言为主力编程语言,并且基于Go语言制定了公司级的编程规范,以及生产级高可靠、高安全、高性能的可信编程要求。本书内容也源自笔者团队在Kubernetes、Docker等云原生开源社区,以及华为云多款云原生服务产品中的实际生产级经验总结。
本书写作目的 本书作为华为云原生技术丛书的一员,面向Go语言程序员及感兴趣的技术人员,普及与推广Go语言。
很多公司推崇一次性把事情做对的文化,对于编程而言,一次性写出高质量的代码就是对该文化最好的诠释。写出高质量的代码,对程序员有两点基本要求:
精通编程语言的内部实现机制; 丰富的实践经验,不断总结。 Go语言是一门非常容易上手的语言,即便是新手,通过官方文档都可以很快地熟悉其语法并运用到项目中。面对项目需求,我们不仅需要将其快速地实现出来,而且还要保证它总是能按照我们的预期运行,这就需要对编程语言有比较深入的认识。考虑到写出没有缺陷的程序是我们始终追求但永远无法实现的奢望,我们所能做的只是尽可能地减少缺陷及从缺陷中不断学习。
本书希望把笔者对Go语言的理解,以及来自云原生开源社区和公司内部的经验与广大的Go语言从业者分享,希望能帮助读者提升自身对Go语言的认识、写出高质量的代码。
本书特点 这是一本定位于Go语言进阶的书籍,主要讲解Go语言特性的实现机制,但为了照顾新手程序员,也为了循序渐进、由浅入深地展开介绍,在介绍特性前也会从基础用法讲起,所以不管是初级程序员,还是有一定编程经验的程序员,都可以是本书的读者。
了解Go语言特性最直接的做法是阅读其实现源码,但Go语言源码晦涩难懂,容易让人望而生畏。所以,如何从浩如烟海的源码中提炼出实现原理并以读者容易理解的方式描述出来就是本书的重点。
在讲解Go语言实现原理时,本书尽可能地使用源码中的数据结构,并配以适量的图文来帮助理解。除了对Go语言特性的介绍,本书还包括一些精心设计的测试题目,用于帮助读者检验自己的能力水平。此外,本书还收录了一些发生在真实项目中的陷阱案例,这些案例大都源自商业项目或开源项目,值得参考。
本书结构 本书内容涵盖常见的数据结构、控制结构、基础概念、标准库、工程工具及案例分享。
第1章和第2章主要介绍常见的数据结构,如管道、切片、map等,以及常见的控制结构,如select和range。建议读者在阅读这两章时先认真做一做每个章节的热身题目,以便于检测自已对相关知识点的掌握程度。
第3章和第4章主要介绍Go语言关键的概念,即协程和垃圾回收。协程机制涉及操作系统的设计,而垃圾回收涉及内存管理,都是比较复杂的知识,这两章主要介绍一些基础的概念,可作为读者进一步深入研究的引子。
第5章至第10章主要介绍常用Go语言标准库的实现原理,比如互斥锁、读写锁、context、reflect、testing、timer等。这些章节没有先后顺序之分,读者可以根据自身需求选择阅读。
第11章和第12章包含了Go语言工具链的内容,包括如何管理多个Go版本及Go Module。Go Module是Go官方提供的依赖包管理工具,其他第三方依赖包管理工具逐渐被Go Module所替代,这部分内容不仅包含如何使用Go Module,还对Go Module的实现机制做了探讨。
第13章记录了来自开源社区和实际生产级项目的部分踩坑案例,出于信息安全、方便叙述的考虑,笔者对这些案例做了一定程度的精简,实际项目中这些问题会非常隐蔽。虽然这些知识点在前面的章节中均有介绍,但本章还是值得阅读,因为写出高质量代码不仅需要对语言本身有深刻的理解,也需要不断吸取前人的经验。
本书援引的Go语言源码,如无特别注明,则主要源自Go 1.11,同时本书也覆盖了Go 1.12至1.14版本新增的主要特性。
表达约定 本书的讨论内容可能在不同的上下文语境下对相同的事物出现不同的表述方式,比如:
管道:有时会使用更贴近源码实现的channel甚至chan名称。 切片:有时会使用更贴近源码实现的slice名称。 上下文:有时会使用Context表示上下文接口或用于章节标题中,有时也直接使用context。 复制:往往会使用拷贝或克隆等业内相对通用的词语表示。
勘误和支持 若您在阅读本书的过程中有任何问题或者建议,可以通过本书源码仓库提交Issue或者PR,也可以关注容器魔方微信公众号并加入微信群与作者交流。我们十分感谢并重视您的反馈,会对您提出的问题、建议进行梳理与反馈,并在本书后续版本中及时做出勘误与更新。
致谢 在本书的写作及成书过程中,本书作者团队得到了公司内外许多领导、同事、朋友及家人的鼓励和帮助。
感谢华为云郑叶来、张宇昕、高江海、李帮清、方璞等业务主管对华为云原生技术丛书及本书写作的大力支持。
感谢华为云可信软件能力团队的李新峰、彭瑞林、黄凌云,以及华为云容器团队王泽锋、毛杰、张琦、黄毽等对本书的审阅和建议。
感谢电子工业出版社博文视点陈晓猛编辑,陈编辑一丝不苟地制定出版计划及组织工作,本书才得以顺利出版。
感谢每一位Go语言布道者,他们的各种分享、博客文章及书籍都在积极推动着Go语言的发展,也为本书编写提供了灵感和参考;
任洪彩
华为云原生开源团队核心成员
刘赫伟 博士
华为云原生技术丛书 总编
华为云容器服务域 技术总监
|
|