描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111740797丛书名: 程序员书库
前言
致谢
作者简介
第一部分 初步了解Go
第1章 Go简介 4
1.1 Go与Java的初步比较 4
1.1.1 Go是编译型语言(Java
是解释型语言) 5
1.1.2 Go与Java的程序结构类似 5
1.1.3 Go与Java有影响代码结构
的代码风格差异 5
1.1.4 Go和Java都是过程语言 6
1.1.5 Java是一门面向对象的语言,
但Go不是完全面向对象的 6
1.1.6 Java是一门高度函数式语言,
Go不是 6
1.1.7 Java是一门高度声明性语言,
Go不是 7
1.1.8 很多Java特性是注解驱动的 7
1.1.9 Java和Go都使用内存管理
(垃圾收集器) 7
1.1.10 Go和Java都支持并发,
但方式不同 8
1.1.11 Go的运行时比JRE简单 8
1.1.12 Go程序构建过程是不同的 8
1.1.13 Go与Java有相似的发布
周期 9
1.2 Java有而Go没有的特性 9
1.2.1 多重赋值 10
1.2.2 语句和操作符 10
1.2.3 assert语句 10
1.2.4 while与do语句 10
1.2.5 throw语句/throws子句 11
1.2.6 strictfp、transient、volatile、synchronized、abstract、
static 11
1.2.7 对象、类、内部类、Lambda、this、super、显式构造
函数 11
1.2.8 泛型和方法 12
1.2.9 广泛的函数式编程能力 13
1.2.10 原始值的装箱 13
1.2.11 源码注解 13
1.2.12 多种可见性 13
1.2.13 重载/覆盖函数 14
1.2.14 正式的枚举 14
1.2.15 内置二进制数据自
序列化 14
1.2.16 并发集合 14
1.3 Go与Java的深度比较 15
第二部分 Go语言
第2章 Go的基础特性 21
2.1 语言关键字 21
2.2 操作符和标点符号 23
2.3 Go操作符优先级 26
2.4 Go内置函数 27
第3章 Go的关键特性 28
3.1 简单的Go程序示例 30
3.2 Go包 34
3.3 Go注释 35
3.4 Go构建/运行过程 36
3.4.1 Go集成开发环境 37
3.4.2 构建Go程序 40
3.4.3 运行Go程序 41
3.4.4 字节码与实码 42
3.5 Go命令行工具 43
3.5.1 捆绑在Go命令中的工具 44
3.5.2 其他工具 45
3.6 Go运行程序而非类 45
3.7 Go内存管理 46
3.8 Go标识符 50
3.9 Go作用域 50
Go作用域与Go源文件 52
3.10 初始化Go变量 54
3.11 Go标识符的生命期 56
3.12 Go模块摘要 56
3.13 Go赋值和表达式 60
3.14 Go中的文本格式设置 61
3.15 Go协程(并发执行单元) 65
3.15.1 并发问题 65
3.15.2 Go并发 66
3.15.3 Go协程示例 69
第4章 Go类型 76
4.1 基本/内置类型 76
4.1.1 数值 76
4.1.2 字符和字符串 77
4.1.3 引用与指针类型 78
4.1.4 深入基本数据类型 80
4.1.5 方法作为函数 95
4.1.6 任何被声明的类型都可以
有自定义函数 96
4.1.7 函数作为值 97
4.1.8 结构字段 102
4.1.9 结构体字面量 104
4.1.10 嵌套结构 104
4.1.11 结构体字段对齐 105
4.1.12 接口 108
4.1.13 复合接口 110
4.2 变量声明 113
4.3 常量声明 115
4.4 类型转换 116
4.5 类型测试 117
4.6 派生类型声明 119
第5章 错误与panic 122
5.1 Go错误 122
5.2 Go panic 123
5.3 错误与panic演示 126
第6章 Go语句 131
6.1 包与导入语句 132
6.2 赋值语句 133
6.3 声明变量 133
6.4 声明命名常量 135
6.5 if/else语句 136
6.6 switch语句 138
6.7 while语句 140
6.8 do-while语句 140
6.9 带索引的for语句 141
6.10 遍历集合的for语句 141
6.11 无限循环 143
6.12 break与continue语句 144
6.13 goto语句 144
6.14 return语句 144
6.15 defer语句 145
6.16 go语句 146
6.17 select语句 147
第7章 接口应用 149
7.1 接口是核心 149
7.2 有关依赖注入 151
7.3 面向切面编程 156
第8章 Go单元测试和基准测试 160
8.1 Go测试用例和基准测试 160
8.2 Java测试用例 169
第9章 Go的未来 173
9.1 改进的错误处理 173
9.2 Go泛型 174
9.3 生命游戏的capstone示例 178
9.4 生命游戏的Go源代码 181
9.4.1 Java实现的capstone
项目 182
9.4.2 Go实现的capstone
项目 213
9.5 API输出 234
9.6 Game输出 237
第三部分 Go库综述
第10章 主要包比较 248
10.1 Java语言包 248
10.2 JavaIO包 251
10.3 Java Text包 252
10.4 Java Time包 253
10.5 Java Util包 254
第11章 重要方法/函数比较 259
第12章 Go包概述 263
12.1 Go的文件访问 263
12.2 压缩服务 265
?12.2.1 存档包 265
?12.2.2 压缩包 267
12.3 image包 268
12.4 Input/Output(I/O) 269
12.5 字节包 274
12.6 格式化包 276
12.7 数据集合 278
12.8 排序 279
12.9 上下文包 281
12.10 密码学、哈希和数据
编码 283
12.11 encoding包 284
第13章 SQL数据库访问 288
第14章 客户端和服务器支持 296
14.1 MIME包 296
14.2 网络包 296
14.3 net包 296
14.4 HTTP template包 305
14.5 net.http包 309
自20世纪90年代中期首次亮相以来,Java获得了巨大成功。相比于其他语言,Java在Web应用程序和关键数据处理(例如大数据工具)领域扮演了重要角色。除此之外,Java在操作系统和硬件架构之间的高度可移植性、丰富且不断改进的语言和函数库,与其良好的性能一起促成了它的成功。
但Java也有一些缺点。Java创建于面向对象编程刚刚规范化、网络传输代码刚刚规模化的时代。随之而来的问题是Java运行时(runtime)占用空间大、资源需求大。Java开发人员试图通过Java模块、标准库子集和Graal虚拟机解决。但实现同样的功能,Go语言比Java语言更节省资源。
随着时间的推移,Java语言和运行时不再是众多现代(尤其是云平台)程序的最佳选择。另外,Java的持续发展带来了一个问题:人们很难全面掌握它。Go却是一门简单易懂的
语言。
Go语言及其运行时相对较新,旨在满足现代云计算系统和其他系统编程任务的需求。很多人认为它是“比C更好的C”,可能替代C语言,因为Go是与C极为相似的语言。Go语言也可实现Java在服务器和应用程序方面的大部分功能。这是本书成书的原因。
现在,Go语言正在用于许多新应用程序的开发和已有应用程序的重构上。以前用Java开发的程序,可能选择Kotlin或ScalaJVM(都是基于Java虚拟机的语言)重构,但现在Go语言常常超越二者。例如,Khan Academy使用Go重构其Python网站。由于Go具有类似脚本语言的易用性以及编译语言的高效性,因此常被用于重构。
Go首席设计师Robert Griesemer、Rob Pike、Ken Thompson都在谷歌工作,他们对Go语言以及相关运行时应该具备的特性设想如下(某些特性Java也有):
高开发效率。Go提供了一个方便且合理的完整运行时,并提供了一站式工具链,有广泛的社区支持。
可读性和开发人员可用性高。语言本身小,易于学习,它的代码容易阅读和理解,而不是易于编写。它的目标是具有Python等非静态语言的易用性。通常情况下,这种语言是“固执”的(要么接受,要么放弃)。
Go使用内存垃圾收集(Garbage Collection,GC)机制,降低程序员的工作量,并确保程序可靠。
Go是静态链接的(而不是如Java那样是动态链接的),便于程序的部署和运行管理。
静态类型。通常支持更安全、更高效、更可预测的程序,对服务器的高可靠性和长时间运行有帮助。
运行时效率。代码高效地利用处理器,与C/C++程序效率相当。
高网络性能。现在代码需要适应广泛使用的分布式/云应用。对于实现相同级别的功能,Go通常比Java的资源密度低。这有助于减少资源占用,提高现代云分布的规模。
多处理器系统的高利用率。目前代码需要便捷、安全地利用多核系统。Go擅长利用多核系统。
Rob Pike对Go特性归纳如下:
……我们希望该语言具有静态编译语言(如C++和Java)的安全性和性能,但也有动态类型的解释语言(如Python)的轻巧和趣味。同样重要的是,它应适用于现代、网络化、多核硬件上的大型系统软件开发。
Go Brand Book(GBB)指出:
Go是一种开源编程语言,能够大规模开发简单、高效和可靠的软件。
GBB进一步说明,Go语言对于新程序员具有如下优点。
在保证静态语言的速度、安全性和可靠性的同时,达到了动态语言的生产力。
易学、易读。
拥有一个充满活力的社区(涵盖开源开发者、初创公司、大公司和大学)。
是面向云的编程语言。
对于有经验的程序员具有如下优点。
可以解决重大工程问题。
由谷歌支持,谷歌理解并支持开源社区对Go的具体需求。
行业内对Go程序员的需求旺盛。
在很多方面,Go很像Node.js—一个流行的基于JavaScript的应用程序开发平台。Node.js可快速开发轻量级服务器,因此是一个受欢迎的微服务平台。Node.js与Go拥有类似的功能、历史和社区支持。因为Go语言的类型安全和Go协程(相对于Node.js的事件循环),Go可提供比Node.js更大的规模和更可靠的解决方案。作者认为,Go将替代大量的Node.js用例。
因此,可以用Go语言来重新编写许多以前用Java编写的应用程序,尤其是云环境中的那些。
下面是相比Java而言Go具有的一些优点。
Go是一门较小型的语言,具有简洁、可维护和易学等特性。
Go更适用于多核处理器和高级并发。
Go自带了一套小型但功能强大的标准库,适用于构建服务器程序。
Go适用于云中的执行,尤其是在容器化环境中。
Go适用于代码量与运行时资源消耗较大可能带来问题的受约束的环境。
Go是开源的,拥有活跃的开发人员社区,且由谷歌赞助,轻易不会消失。此外,Go社区承诺过未来Go会保持向后兼容。这使得Go成为一门适用于商业开发的优秀语言。
Hacker Noon上有文章表示:Go正成为下一代企业编程语言。
Go是一门专为大规模软件开发而设计的语言,提供了健壮的开发体验,并避免了现有语言的许多问题。这些因素都促使Go最有可能替代Java,成为未来企业中主流的软件开发平台。总体来说,它们(Go的设计选择)让Go成为Java以外针对大型开发项目的现代编程语言最优选择。
InfoWorld上有文章指出:
Google的Go语言已经很有名了,它轻量化、编译快,而且包含丰富的库和抽象,从而适用于并发和分布式(云)应用开发。但衡量编程语言成功与否的真正标准是开发人员用它创建的项目。Go已被证明是快速开发网络服务、软件基础设施项目和各种紧凑而强大的工具的首选。
使用了Go语言的开源软件有Docker、Kubernetes、Fedora CoreOS、InfluxDB、Istio、Traefik、Hugo、Terraform、CockroachDB与Gravitational Teleport。
值得注意的是:Docker和Kubernetes是容器化许多现代应用的基础技术,很多组织基于二者构建了稳健、优秀的系统。这都是Go语言与其运行时成熟的证明。
Brainhub上列出了使用Go的大公司所看到的这门语言的优势。
代码简洁。
适合构建大项目。
易学。
一个问题一个解决方案。
易维护。
类C。
专为多核处理器设计。
专为互联网设计。
快速编译。
应用程序小。
开源模型。
使用Go的公司包括Google(这是当然的)、Uber、Twitch、Dailymotion、SendGrid、Dropbox与SoundCloud。
Awesome Open Source列出了超过15 000(还在增加中)个使用Go的项目。
Sandra Parker预计Go有一个成功的未来,她强调:因为它是由谷歌创造的。
她也给出了Go流行的原因:Go是与众不同的,是一门年轻的语言,一开始就因功能强大吸引了众多程序员。
以及随着时间的推移,Go越来越流行的原因:Go编写的程序性能好。Go兼有C/C++的效率、Java的并行处理以及Python、Perl、Erlang的易读等特点……这是众多公司从其他语言转向Go的原因。Go是未来的语言。
2020年,Ziff Davis声称Go是最需要学习的语言,如图0-1所示。
还有一些组织赞扬了Go的优点,并指出它的未来前景广阔。例如Towards Data Science列出Go成功的关键特性。
Go在语言层面支持并发。通过Go协程(轻量级绿色线程)和通道提供了基于CSP(通信顺序进程)的消息传递并发。
Go的最大独特卖点(USP)是其语言设计与简洁性。它成功融合了Python的简洁多产和C语言的强大。
Go内置了垃圾收集器(尽管不如JVM垃圾收集器那么成熟)。Go开发人员能够像使用Java、Python那样进行安全的系统编程。
图0-1 专业人士想学的编程语言
Go被GeeksforGeeks列入最受欢迎的语言前5名,表述如下:
Go是一种静态类型的开源编程语言,由谷歌设计,它使程序员的工作效率更高,并帮助他们轻松构建简单、可靠和高效的软件。这种语言在语法上类似C语言,但具有内存安全、垃圾收集机制、结构化类型机制和CSP风格的并发性质。Go因在网络和多核领域的高性能而出名。
本书将简要介绍Go背后的概念以及诞生理由。首先将介绍Go的各种特性以及它与Java的差异,而后将介绍Go语言的语句和数据类型,以及未来Go会进一步增强的功能,接着将介绍一个capstone Go程序示例来体验Go编程,接下来我们将Go标准库与对应的Java库进行对比,最后是Go标准库的各部分的使用介绍。这部分内容在Go网站有更深入、更全面的描述。
确切来说,本书主体分为三部分:第一部分介绍Go语言的一些背景,包括Go的简要介绍,以及与Java的主要特性对比;第二部分描述Go语言的主要特性,以及在实践中的应用;第三部分介绍Go的标准库,将Go标准库与Java库进行了对比,并总结了Go的关键标准库。另外,本书还有5个附录,包含Go的安装介绍以及一些摘要和参考信息。
注
意在本书的例子中,长语句被分割为多行。这在实际Go源代码中是不允许的。
本书的相关代码可在www.github.com/apress/go- for-Java- programmers下载。
评论
还没有评论。