《精通Go语言(第2版)》是由清华大学出版社出版的一本关于Go语言方面的书籍,作者是米哈里斯·托卡洛斯,主要介绍了关于Go语言方面的知识内容,目前在Go语言类书籍综合评分为:8.2分。
书籍介绍
编辑推荐
《精通Go语言(第2版)》旨在帮助读者成为一名更加优秀的Go语言开发者。
本书涵盖了许多令人激动的主题,包括与Go语言机器学习相关的新增章节,以及与Viper和Cobra Go包、gRPC、Docker镜像协同操作、YAML文件协同操作、go/scanner和go/token包协同操作、从Go语言中生成WebAssembly代码相关的信息和示例。
本书适用于希望进一步提升编程水平的中级Go程序员和Go语言编程爱好者;此外,本书也适用于具有一定编程经验的使用其他语言的开发人员,他们希望了解Go语言,但并不打算从for循环开始从头学起。
内容简介
《精通Go语言(第2版)》详细阐述了与Go语言相关的基本解决方案,主要包括Go语言和操作系统,理解Go语言的内部机制,处理Go语言中的基本数据类型,组合类型的使用,利用数据结构改进Go代码,Go包和函数,反射和接口,UNIX系统编程,Go语言中的并发编程—协程、通道和管道,Go语言的并发性—高级话题,代码测试、优化和分析,网络编程基础知识,网络编程—构建自己的服务器和客户端,Go语言中的机器学习等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。
目录
- 第1部分
- 第1章 Go语言和操作系统 3
- 1.1 Go语言的历史 3
- 1.2 Go语言的未来 4
- 1.3 Go语言的优点 4
- 1.3.1 Go语言是否完美 5
- 1.3.2 预处理器 5
- 1.3.3 godoc实用程序 6
- 1.4 编译Go代码 7
- 1.5 执行Go代码 8
- 1.6 两条Go语言规则 8
- 1.7 下载和使用外部的Go包 10
- 1.8 UNIX stdin、stdout和stderr 12
- 1.9 输出结果 12
- 1.10 使用标准输出 14
- 1.11 获取用户输入 16
- 1.11.1 :=和= 16
- 1.11.2 从标准输入中读取 17
- 1.11.3 与命令行参数协同工作 18
- 1.12 错误的输出结果 20
- 1.13 写入日志文件中 22
- 1.13.1 日志级别 22
- 1.13.2 日志工具 23
- 1.13.3 日志服务器 23
- 1.13.4 将信息发送至日志文件的Go程序 24
- 1.13.5 log.Fatal()函数 26
- 1.13.6 log.Panic()函数 27
- 1.13.7 写入自定义日志文件中 29
- 1.13.8 在日志项中输出行号 31
- 1.14 Go语言中的错误处理机制 32
- 1.14.1 错误数据类型 33
- 1.14.2 错误处理机制 35
- 1.15 使用Docker 37
- 1.16 练习和链接 42
- 1.17 本章小结 43
- 第2章 理解Go语言的内部机制 45
- 2.1 Go编译器 45
- 2.2 垃圾收集 47
- 2.2.1 三色算法 49
- 2.2.2 Go垃圾收集器的更多内容 52
- 2.2.3 映射、切片和Go垃圾收集器 53
- 2.2.4 不安全的代码 57
- 2.2.5 unsafe包 58
- 2.2.6 unsafe包的另一个示例 59
- 2.3 从Go程序中调用C代码 60
- 2.3.1 利用同一文件从Go程序中调用C代码 60
- 2.3.2 利用单独的文件从Go程序中调用C代码 61
- 2.3.3 C代码 61
- 2.3.4 Go代码 62
- 2.3.5 混合Go和C代码 63
- 2.4 从C代码中调用Go函数 64
- 2.4.1 Go包 65
- 2.4.2 C代码 66
- 2.5 defer关键字 67
- 2.6 panic()和recover()函数 71
- 2.7 两个方便的UNIX实用程序 74
- 2.7.1 strace工具 74
- 2.7.2 dtrace工具 75
- 2.8 Go环境 76
- 2.9 go env命令 78
- 2.10 Go汇编器 79
- 2.11 节点树 80
- 2.12 go build的更多内容 86
- 2.13 生成WebAssembly代码 88
- 2.13.1 WebAssembly简介 88
- 2.13.2 WebAssembly的重要性 89
- 2.13.3 Go和WebAssembly 89
- 2.13.4 示例 89
- 2.13.5 使用生成后的WebAssembly代码 90
- 2.14 一般的Go编码建议 92
- 2.15 练习和链接 93
- 2.16 本章小结 93
- 第3章 处理Go语言中的基本数据类型 95
- 3.1 数字数据类型 95
- 3.1.1 整数 96
- 3.1.2 浮点数 96
- 3.1.3 复数 96
- 3.1.4 Go 2中的数字字面值 98
- 3.2 Go语言中的循环 99
- 3.2.1 for循环 99
- 3.2.2 while循环 99
- 3.2.3 range关键字 100
- 3.2.4 多种Go循环示例 100
- 3.3 Go语言中的数组 102
- 3.3.1 多维数组 102
- 3.3.2 数组的缺点 105
- 3.4 Go语言中的切片 105
- 3.4.1 在切片上执行基本的操作 106
- 3.4.2 自动扩展 108
- 3.4.3 字节切片 109
- 3.4.4 copy()函数 109
- 3.4.5 多维切片 112
- 3.4.6 切片的另一个示例 112
- 3.4.7 利用sort.Slice()函数对切片进行排序 114
- 3.4.8 向切片中附加一个数组 116
- 3.5 Go语言中的映射 117
- 3.5.1 存储至nil映射中 119
- 3.5.2 何时应使用映射 120
- 3.6 Go语言中的常量 120
- 3.7 Go语言中的指针 124
- 3.8 时间和日期 127
- 3.8.1 与时间协同工作 128
- 3.8.2 解析时间 129
- 3.8.3 与日期协同工作 130
- 3.8.4 解析日期 130
- 3.8.5 修改日期和时间格式 132
- 3.9 度量Go语言中的命令和函数的执行时间 133
- 3.10 度量Go语言垃圾收集器的操作 135
- 3.11 Web链接和练习 136
- 3.12 本章小结 136
- 第4章 组合类型的使用 137
- 4.1 关于组合类型 137
- 4.2 Go语言中的结构 137
- 4.2.1 指向结构的指针 140
- 4.2.2 Go语言中的new关键字 142
- 4.3 Go语言中的元组 142
- 4.4 Go语言中的正则表达式和模式匹配 144
- 4.4.1 理论知识简介 144
- 4.4.2 简单的示例 144
- 4.4.3 高级示例 147
- 4.4.4 匹配IPv4地址 150
- 4.5 Go语言中的字符串 154
- 4.5.1 rune 156
- 4.5.2 unicode包 158
- 4.5.3 strings包 159
- 4.6 switch语句 163
- 4.7 计算高精度Pi值 167
- 4.8 生成Go语言中的键-值存储 170
- 4.9 Go语言和JSON格式 175
- 4.9.1 读取JSON数据 175
- 4.9.2 保存JSON数据 177
- 4.9.3 使用Marshal()和Unmarshal()函数 179
- 4.9.4 解析JSON数据 181
- 4.9.5 Go语言和XML 183
- 4.9.6 读取XML文件 186
- 4.9.7 自定义XML格式 188
- 4.10 Go语言和YAML格式 189
- 4.11 附加资源 190
- 4.12 练习和Web链接 190
- 4.13 本章小结 191
- 第2部分
- 第5章 利用数据结构改进Go代码 195
- 5.1 图和节点 195
- 5.2 度量算法的复杂度 196
- 5.3 二叉树 196
- 5.3.1 实现Go语言中的二叉树 197
- 5.3.2 二叉树的优点 199
- 5.4 Go语言中的哈希表 200
- 5.4.1 实现Go语言中的哈希表 201
- 5.4.2 实现查找功能 204
- 5.4.3 哈希表的优点 204
- 5.5 Go语言中的链表 205
- 5.5.1 实现Go语言中的链表 206
- 5.5.2 链表的优点 209
- 5.6 Go语言中的双向链表 210
- 5.6.1 实现Go语言中的双向链表 211
- 5.6.2 双向链表的优点 214
- 5.7 Go语言中的队列 214
- 5.8 Go语言中的栈 218
- 5.9 container包 221
- 5.9.1 使用container/heap 221
- 5.9.2 使用container/list 224
- 5.9.3 使用container/ring 226
- 5.10 在Go语言中生成随机数 227
- 5.11 生成安全的随机数 233
- 5.12 执行矩阵计算 234
- 5.12.1 矩阵的加法和减法 235
- 5.12.2 矩阵乘法 237
- 5.12.3 矩阵的除法 241
- 5.12.4 计算数组维度 246
- 5.13 求解数独谜题 247
- 5.14 附加资源 251
- 5.15 本章练习 251
- 5.16 本章小结 252
- 第6章 Go包和函数 253
- 6.1 Go包 253
- 6.2 Go语言中的函数 254
- 6.2.1 匿名函数 254
- 6.2.2 返回多个值的函数 255
- 6.2.3 命名函数的返回值 257
- 6.2.4 包含指针参数的函数 258
- 6.2.5 返回指针的函数 259
- 6.2.6 返回其他函数的函数 260
- 6.2.7 接收其他函数作为参数的函数 262
- 6.2.8 可变参数函数 263
- 6.3 开发自己的Go包 264
- 6.3.1 编译Go包 266
- 6.3.2 私有变量和函数 267
- 6.3.3 init()函数 267
- 6.4 Go模块 269
- 6.4.1 创建并使用Go模块 270
- 6.4.2 使用同一Go模块的不同版本 278
- 6.4.3 Go模块在Go语言中的存储位置 279
- 6.4.4 go mod vendor命令 280
- 6.5 创建较好的Go包 281
- 6.6 syscall包 282
- 6.7 go/scanner、go/parser和go/token包 286
- 6.7.1 go/ast包 287
- 6.7.2 go/scanner包 287
- 6.7.3 go/parser包 289
- 6.7.4 操作示例 292
- 6.7.5 利用给定的字符串长度查找变量名 293
- 6.8 文本和HTML模板 298
- 6.8.1 生成文本输出 299
- 6.8.2 构建HTML输出结果 301
- 6.9 附加资源 308
- 6.10 练习 309
- 6.11 本章小结 309
- 第7章 反射和接口 311
- 7.1 类型方法 311
- 7.2 Go接口 313
- 7.3 编写自己的接口 316
- 7.3.1 使用Go接口 316
- 7.3.2 使用switch语句和数据类型 318
- 7.4 反射 320
- 7.4.1 简单的反射示例 321
- 7.4.2 高级反射示例 323
- 7.4.3 反射的缺点 326
- 7.4.4 reflectwalk库 326
- 7.5 Go语言中的面向对象编程 329
- 7.6 Git和GitHub简介 332
- 7.6.1 使用Git 332
- 7.6.2 git status命令 333
- 7.6.3 git pull命令 333
- 7.6.4 git commit命令 333
- 7.6.5 git push命令 334
- 7.6.6 与分支协同工作 334
- 7.6.7 与文件协同工作 335
- 7.6.8 .gitignore文件 336
- 7.6.9 使用git diff命令 336
- 7.6.10 与标签协同工作 337
- 7.6.11 git cherry-pick命令 338
- 7.7 使用Delve进行调试 339
- 7.8 附加资源 343
- 7.9 本章练习 344
- 7.10 本章小结 344
- 第3部分
- 第8章 UNIX系统编程 347
- 8.1 UNIX进程 348
- 8.2 flag包 348
- 8.3 viper包 353
- 8.3.1 简单的viper示例 353
- 8.3.2 从flag到viper包 354
- 8.3.3 读取JSON配置文件 356
- 8.3.4 读取YAML配置文件 358
- 8.4 cobra包 360
- 8.4.1 简单的cobra示例 361
- 8.4.2 创建命令行别名 366
- 8.5 io.Reader和io.Writer接口 369
- 8.6 bufio包 369
- 8.7 读取文本文件 370
- 8.7.1 逐行读取文本文件 370
- 8.7.2 逐个单词读取文本文件 372
- 8.7.3 逐个字符读取文本文件 374
- 8.7.4 从/dev/random中读取 376
- 8.8 读取特定的数据量 377
- 8.9 二进制格式的优点 379
- 8.10 读取CSV文件 380
- 8.11 写入文件中 383
- 8.12 加载和保存磁盘上的数据 386
- 8.13 再访strings包 389
- 8.14 bytes包 391
- 8.15 文件权限 392
- 8.16 处理UNIX信号 394
- 8.16.1 处理两个信号 394
- 8.16.2 处理全部信号 397
- 8.17 Go语言中的UNIX管道编程 399
- 8.18 syscall.PtraceRegs 401
- 8.19 跟踪系统调用 403
- 8.20 用户ID和组ID 408
- 8.21 Docker API和Go语言 409
- 8.22 附加资源 412
- 8.23 本章练习 413
- 8.24 本章小结 413
- 第9章 Go语言中的并发编程—协程、通道和管道 415
- 9.1 进程、线程和协程 415
- 9.1.1 Go调度器 416
- 9.1.2 并发和并行 416
- 9.2 协程 417
- 9.2.1 创建一个协程 417
- 9.2.2 创建多个协程 418
- 9.3 等待协程结束 420
- 9.4 通道 424
- 9.4.1 写入通道 424
- 9.4.2 从通道中读取数据 426
- 9.4.3 从关闭的通道中读取 427
- 9.4.4 作为函数参数的通道 428
- 9.5 管道 429
- 9.6 竞态条件 433
- 9.7 Go语言和Rust语言并发模型的比较 435
- 9.8 Go语言和Erlang语言并发模型的比较 435
- 9.9 附加资源 436
- 9.10 本章练习 436
- 9.11 本章小结 436
- 第10章 Go语言的并发性—高级话题 437
- 10.1 再访Go调度器 437
- 10.2 select关键字 440
- 10.3 协程超时 443
- 10.3.1 协程超时第1部分 443
- 10.3.2 协程超时第2部分 445
- 10.4 再访Go通道 447
- 10.4.1 信号通道 448
- 10.4.2 缓冲通道 448
- 10.4.3 nil通道 450
- 10.4.4 通道的通道 452
- 10.4.5 指定协程的执行顺序 454
- 10.4.6 如何使用协程 457
- 10.5 共享内存和共享变量 458
- 10.5.1 sync.Mutex类型 458
- 10.5.2 忘记解锁互斥体 461
- 10.5.3 sync.RWMutex类型 463
- 10.5.4 atomic包 466
- 10.5.5 基于协程的共享内存 468
- 10.6 重访Go语句 470
- 10.7 缓存竟态条件 473
- 10.8 context包 479
- 10.8.1 context包的高级示例 483
- 10.8.2 context包的另一个示例 488
- 10.8.3 worker池 490
- 10.9 附加资源 494
- 10.10 本章练习 494
- 10.11 本章小结 495
- 第11章 代码测试、优化和分析 497
- 11.1 优化 498
- 11.2 优化Go代码 499
- 11.3 分析Go代码 499
- 11.3.1 net/http/pprof标准包 499
- 11.3.2 简单的分析示例 500
- 11.3.3 方便的外部包 508
- 11.3.4 Go分析器的Web界面 510
- 11.4 go tool trace实用程序 514
- 11.5 测试Go代码 518
- 11.5.1 针对现有Go代码编写测试 519
- 11.5.2 测试代码的覆盖率 523
- 11.6 利用数据库后端测试HTTP服务器 526
- 11.6.1 testing/quick包 533
- 11.6.2 测试时间过长或无法结束 537
- 11.7 Go代码基准测试 540
- 11.8 简单的基准测试示例 540
- 11.9 缓冲写入的基准测试 546
- 11.10 查找程序中不可访问的Go代码 551
- 11.11 交叉编译 552
- 11.12 生成示例函数 554
- 11.13 从Go代码到机器代码 556
- 11.14 生成Go代码文档 559
- 11.15 使用Docker镜像 564
- 11.16 附加资源 566
- 11.17 本章练习 567
- 11.18 本章小结 568
- 第12章 网络编程基础知识 569
- 12.1 net/http、net和http.RoundTripper 569
- 12.1.1 http.Response结构 570
- 12.1.2 http.Request结构 570
- 12.1.3 http.Transport结构 571
- 12.2 TCP/IP 572
- 12.3 IPv4和IPv6 573
- 12.4 nc(1)命令行实用程序 573
- 12.5 读取网络接口的配置 574
- 12.6 在Go语言中执行DNS查找 578
- 12.6.1 获取域的NS记录 581
- 12.6.2 获取域的MX记录 582
- 12.7 在Go语言中创建Web服务器 583
- 12.7.1 使用atomic包 587
- 12.7.2 分析一个HTTP服务器 589
- 12.7.3 创建一个站点 594
- 12.8 HTTP跟踪机制 604
- 12.9 在Go语言中创建一个Web客户端 610
- 12.10 HTTP连接超时 615
- 12.10.1 SetDeadline()函数 617
- 12.10.2 在服务器端设置超时时间 618
- 12.10.3 其他超时方式 620
- 12.11 Wireshark和tshark工具 621
- 12.12 gRPC和Go 622
- 12.12.1 定义接口定义文件 622
- 12.12.2 gRPC客户端 624
- 12.12.3 gRPC服务器 626
- 12.13 附加资源 628
- 12.14 本章练习 629
- 12.15 本章练习 630
- 第13章 网络编程—构建自己的服务器和客户端 631
- 13.1 与HTTPS流量协同工作 631
- 13.1.1 生成证书 631
- 13.1.2 HTTPS客户端 632
- 13.1.3 简单的HTTPS服务器 634
- 13.1.4 开发TLS服务器和客户端 636
- 13.2 net标准包 639
- 13.3 开发一个TCP客户端 640
- 13.4 开发一个TCP服务器 643
- 13.5 开发一个UDP客户端 648
- 13.6 部署UDP服务器 650
- 13.7 并发TCP服务器 653
- 13.8 创建TCP/IP服务器的Docker镜像 663
- 13.9 远程过程调用(RPC) 665
- 13.9.1 RPC客户端 666
- 13.9.2 RPC服务器 667
- 13.10 底层网络编程 669
- 13.11 本章资源 677
- 13.12 本章练习 677
- 13.13 本章小结 678
- 第14章 Go语言中的机器学习 679
- 14.1 计算简单的统计属性 679
- 14.2 回归 683
- 14.2.1 线性回归 683
- 14.2.2 实现线性回归 684
- 14.2.3 绘制数据 686
- 14.3 分类 690
- 14.4 聚类 694
- 14.5 异常检测 697
- 14.6 神经网络 700
- 14.7 离群值分析 702
- 14.8 与TensorFlow协同工作 705
- 14.9 与Apache Kafka协同工作 710
- 14.10 附加资源 715
- 14.11 本章练习 716
- 14.12 本章小结 716
- 14.13 接下来的工作 716