查看原文
其他

Learning Go:你的第一本Go语言学习指南

新书速递→ 华章计算机 2022-10-26


Go语言的诞生




2007年9月20日下午,在谷歌山景城总部的一间办公室里,谷歌的顶级程序员Rob Pike在等待一个C++项目构建的过程中与谷歌的另外两个顶级程序员Robert Griesemer和Ken Thompson进行了一次有关设计一门新编程语言的讨论,他们一拍即合,从此诞生了Go这门新的编程语言。


Go语言在2009年开源后,凭借开放活跃的社区,以不可思议的速度成长,并诞生了Docker、Kubernetes等“里程碑级”项目,这些项目让Go被誉为“云计算基础设施新兴语言”,有人直接称其为云计算语言。



Go语言的发展




Go语言解决了当今软件开发人员不得不面对的一个普遍问题:在快速开发和性能之间做出选择。C和C++这类语言提供了很快的代码执行速度,Java在开发效率和运行速度上做了平衡,而Ruby和Python这类语言则擅长快速开发。Go语言很好地兼顾了开发效率和运行速度,不仅提供了高性能的运行时,也降低了大型项目的开发难度。


Go语言发布至今已经有十余年,如今很多大型的互联网系统都建立在Go语言的架构上。几乎每一位程序开发者都会在每天的工作中直接使用Go语言或者使用Go语言编写的工具,从国内一些招聘网站数量庞大的Go语言岗位需求中,也不难发现Go语言的巨大潜力,以及掌握和精通这门编程语言的必要性。


如何学习Go语言




如果你对Go语言略知一二,从未使用Go语言开发过正式项目但希望走进Go语言的世界。如果你已经熟练掌握了一门编程语言(比如Java),下面为你推荐一本快速上手Go语言的绝佳选择:《Learning GO》中文版: Go语言学习指南:惯例模式与编程实践。



本书特色




本书能帮助你快速掌握Go语言的关键字、类型、语法、函数、指针、错误处理、并发编程。你还会发现Go语言致力于编写在较长的软件生命周期中更易于维护的代码。例如,Go编译器对指向局部变量的指针进行了优化处理。倘若你熟悉C语言,相信对指针指向无效的内存所造成的异常并不陌生。
本书除了介绍Go语言的基本语法以外,还对比了Go与C语言,并讲述了Go编译器在平衡性能与提高代码维护性方面所做的优化。



主要内容




本书介绍的概念并不繁杂:第1章主要帮助初学者搭建一个良好的Go语言开发环境;第2~9章由浅入深地讲述Go语言从简单的演示代码编写到实际应用开发所需要的基础知识;第10~13章探索了Go语言在分布式服务器端开发中得天独厚的优势;第14章和第15章指出了Go语言目前的限制和容易被误用或滥用的特性,并展望了Go语言未来的发展趋势。



目标读者




本书的目标读者是想要学习Go语言的开发者,尤其是Go语言的初学者。本书的重点不是简单地用Go写程序,而是写出符合Go语言惯例的程序。有经验的Go开发者可以在书中找到关于如何最有效地使用该语言的新特性的建议。最重要的是,读者希望能够学到如何写出像Go一样的Go代码。


读者需要有开发者行业工具的使用经验,比如版本控制(最好是Git)和IDE。读者还应该熟悉基本的计算机科学概念,如并发编程和抽象,因为书中解释了它们如何在Go中工作。其中一些代码示例可以从GitHub上下载,还有几十个示例可以在The Go Playground上在线试用。虽然互联网连接不是必需的,但它在回顾可执行示例时很有帮助。由于Go经常被用来构建和调用HTTP服务端,所以有些示例需要读者熟悉基本的HTTP概念。




示例代码




本书配套资源可以从https://github.com/learning-go-book下载(示例代码、练习、勘误等)。


目录




上滑查看更多↓

第1章 设置Go语言的开发环境7
1.1 安装Go工具7
1.2 Go的工作空间8
1.3 Go命令集9
1.4 分析与审查13
1.5 选择开发工具15
1.6 Makefile18
1.7 保持更新19
1.8 总结20

第2章 基础类型和变量声明21
2.1 内置类型21
2.2 var与:= 30
2.3 const关键字32
2.4 有类型的常量与无类型的常量33
2.5 未使用的变量34
2.6 常量与变量的命名35
2.7 总结37

第3章 复合类型38
3.1 数组38
3.2 切片40
3.3 字符串、字符和字节49
3.4 映射52
3.5 结构体57
3.6 总结61

第4章 代码块、影子变量和流程控制62
4.1 代码块62
4.2 if语句66
4.3 for语句67
4.4 switch语句78
4.5 默认的switch语句81
4.6 if和switch之间的选择82
4.7 goto语句83
4.8 总结85

第5章 函数86
5.1 函数的声明和调用86
5.2 函数即值92
5.3 闭包95
5.4 defer98
5.5 函数的值调用101
5.6 总结103

第6章 指针104
6.1 指针快速入门104
6.2 不畏惧指针107
6.3 指针即可变的参数109
6.4 指针作为第二选择113
6.5 指针传递可提高性能114
6.6 零值与无值114
6.7 映射与切片的区别115
6.8 切片用作缓冲区118
6.9 优化垃圾回收119
6.10 总结121

第7章 类型、方法与接口122
7.1 Go语言的类型122
7.2 方法123
7.3 使用内嵌进行组合131
7.4 内嵌不是继承132
7.5 接口概览133
7.6 接口是类型安全的鸭子类型134
7.7 内嵌与接口137
7.8 接收接口,返回结构体138
7.9 接口与nil139
7.10 空接口139
7.11 类型断言与type-switch141
7.12 谨慎使用类型断言与type-switch143
7.13 函数类型实现接口145
7.14 隐式接口实现依赖注入146
7.15 Wire150
7.16 Go并非传统意义上的面向对象语言150
7.17 总结150

第8章 错误151
8.1 如何处理错误151
8.2 使用字符串创建简单错误152
8.3 哨兵错误153
8.4 错误是值155
8.5 包装错误157
8.6 Is和As159
8.7 使用defer包装错误162
8.8 panic和recover163
8.9 从错误中获取堆栈跟踪信息165
8.10 总结165

第9章 模块、包和导入166
9.1 仓库、模块和包166
9.2 go.mod166
9.3 创建包167
9.4 模块177
9.5 模块的发布185
9.6模块的版本控制186
9.7 模块代理服务器187
9.8 总结188

第10章 Go的并发编程189
10.1 何时使用并发编程189
10.2 goroutine190
10.3 通道192
10.4 select语句194
10.5 并发实践与模式197
10.6 何时使用互斥锁211
10.7 atomic214
10.8 额外资源214
10.9 总结214

第11章 Go语言标准库215
11.1 标准io库215
11.2 time220
11.3 encoding/json222
11.4 net/http228
11.5 总结234

第12章 上下文235
12.1 什么是上下文235
12.2 取消238
12.3 计时器241
12.4 在上下文中处理取消请求243
12.5 传递值244
12.6 总结249

第13章 测试250
13.1 测试的基本知识250
13.2 表格驱动测试256
13.3 检查代码覆盖率258
13.4 基准测试261
13.5 Go中的测试桩264
13.6 httptest269
13.7 集成测试和编译标签271
13.8 使用竞争检测器检查并发问题272
13.9总结274

第14章 恶龙禁区:反射、unsafe和cgo275
14.1 在运行时使用反射处理类型275
14.2 unsafe意味着不安全289
14.3 cgo用于集成,而不是为了性能294
14.4 总结297

第15章 展望未来:Go中的泛型298
15.1 泛型减少冗余代码,提高类型安全性298
15.2 Go中的泛型300
15.3 类型列表可指定操作符305
15.4 泛型函数抽象算法306
15.5 类型列表限制常量和实现307
15.6 暂不考虑的问题310
15.7 惯例模式与泛型312
15.8 未来更多可能312
15.9 总结313


更多精彩回顾




书讯 | 5月书讯(上)|  元宇宙、因果推断、薛定谔方程...你关注的都在这
书讯 | 5月书讯(下)|设计致物系列+少儿编程好书推荐
书单 | 知乎高赞:有哪些你看了以后大呼过瘾的数据分析书?
干货 | Go语言精进之路:绞尽脑汁,帮你理解方法本质并选择正确的receiver类型
收藏 | 盘点知识图谱在 5 大智能领域的应用
上新 | 产品和运营双视角,9个维度全面讲解用户运营
赠书 | 【第105期】Python将提速2-5倍!你期待吗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存