




《100个Go语言典型错误》介绍了开发者在使用 Go 语言时常犯的 100 个典型错误和低效用法,内容侧重于语言核心和标准库。对大多数错误的讨论都提供了具体的示例,以说明在什么时候容易犯这样的错误。这不是一本教条主文的图书,每个解决方案都详细传达了它适用的上下文。
《100个Go语言典型错误》适合熟悉 Go编程和语法的开发人员阅读。
作者简介:
Teiva Harsanyi 是Docker 公司的资深软件工程师。他曾在多个领域工作,包括保险、交通运输及像空中交通管理这样的安全重点行业。他非常热衷于研究Go 语言及如何设计和实现可靠的应用程序。
目录:
第1章 Go:入门易,精通难 1
1.1 Go 语言概述 1
1.2 简单不意味着容易 3
1.3 100个Go语言错误 3
第2章 代码和项目组织 7
2.1 #1:意想不到的变量隐藏 7
2.2 #2:不必要的嵌套代码 9
2.3 #3:滥用init 函数 13
2.4 #4:过度使用getter 和setter 18
2.5 #5:避免接口污染 19
2.6 #6:在生产者端的接口 27
2.7 #7:返回接口 29
2.8 #8:any 意味着nothing 31
2.9 #9:不知道什么时候使用泛型 33
2.10 #10:没有意识到类型嵌入可能存在的问题 39
2.11 #11:不使用函数式选项模式 43
2.12 #12:项目组织混乱 50
2.13 #13:创建实用程序包 52
2.14 #14:忽略包名称冲突 54
2.15 #15:缺少代码文档 55
2.16 #16:不使用代码检查工具 57
第3章 数据类型 60
3.1 #17:使用八进制字面量会带来混淆 60
3.2 #18:容易忽视的整数溢出 61
3.3 #19:不了解浮点数 65
3.4 #20:不了解切片的长度和容量 69
3.5 #21:低效的切片初始化 74
3.6 #22:对 nil 和空切片的困惑 77
3.7 #23:未正确检查切片是否为空 80
3.8 #24:无法正确复制切片 82
3.9 #25:使用append 的副作用 83
3.10 #26:切片和内存泄漏 87
3.11 #27:低效的 map 初始化 92
3.12 #28:map 和内存泄漏 96
3.13 #29:比较值时发生的错误 98
第4章 控制结构 104
4.1 #30:忽视在 range 循环中元素被复制的事实 104
4.2 #31:忽视 range 循环中参数是如何求值的 108
4.3 #32:忽视在 range 循环中使用指针元素的影响 112
4.4 #33:在 map 迭代过程中做出错误假设 115
4.5 #34:忽视break 语句是如何工作的 119
4.6 #35:在循环中使用defer 121
第5章 字符串 124
5.1 #36:不理解 rune 的概念 124
5.2 #37:字符串迭代不准确 126
5.3 #38:乱用 trim 函数 129
5.4 #39:缺乏优化的字符串连接 131
5.5 #40:无用的字符串转换 133
5.6 #41:子字符串和内存泄漏 135
第6章 函数与方法 138
6.1 #42:不知道使用什么类型的接收器 138
6.2 #43:不要使用命名的结果参数 142
6.3 #44:使用命名的结果参数的意外副作用 144
6.4 #45:返回一个 nil 接收器 146
6.5 #46:使用文件名作为函数输入 150
6.6 #47:忽略defer 语句参数和接收器的计算 152
第7章 错误管理 158
7.1 #48:panic 158
7.2 #49:搞不清何时需要包装错误 161
7.3 #50:不准确的错误类型检查 165
7.4 #51:错误地检查错误值 168
7.5 #52:处理同一个错误两次 170
7.6 #53:忽略错误 173
7.7 #54:忽略 defer 语句返回的错误 174
第8章 并发:基础 179
8.1 #55:混淆并发和并行 179
8.2 #56:认为并发总是更快 182
8.3 #57:对何时使用channel 或互斥锁感到困惑 190
8.4 #58:不理解竞争问题 191
8.5 #59:不了解工作负载类型对并发的影响 199
8.6 #60:误解 Go 上下文 205
第9章 并发:实践 214
9.1 #61:传播不恰当的上下文 214
9.2 #62:在不知道何时停止的情况下启动 goroutine 217
9.3 #63:没有小心处理 goroutine 和循环变量 219
9.4 #64:使用 select 和channel 来期待确定性行为 221
9.5 #65:没有使用通知channel 226
9.6 #66:没有使用 nil channel 227
9.7 #67:对channel 缓冲区大小感到困惑 233
9.8 #68:忘记字符串格式化可能产生的副作用 235
9.9 #69:使用 append 函数创造了数据竞争 239
9.10 #70:对切片和 map 不准确地使用互斥锁 242
9.11 #71:错误使用 sync.WaitGroup 244
9.12 #72:忘记了 sync.Cond 247
9.13 #73:没有使用 errgroup 252
9.14 #74:复制sync 类型 256
第10章 标准库 260
10.1 #75:提供错误的持续时间 260
10.2 #76:time.After 和内存泄漏 261
10.3 #77:常见的JSON 处理错误 264
10.4 #78:常见的 SQL 错误 271
10.5 #79:没有关闭瞬时资源 277
10.6 #80:在响应HTTP 请求后忘记加return 语句 283
10.7 #81:使用默认的HTTP 客户端和服务端 285
第11章 测试 291
11.1 #82:未区分测试种类 291
11.2 #83:未打开-race 开关 296
11.3 #84:未使用测试执行模式 299
11.4 #85:未使用表格驱动型测试 301
11.5 #86:在单元测试中休眠 306
11.6 #87:没有有效处理 time API 309
11.7 #88:未使用测试工具包 313
11.8 #89:写出不准确的基准测试 319
11.9 #90:未探索所有的 Go 测试特性 328
第12章 优化 335
12.1 #91:不了解 CPU 缓存 335
12.2 #92:编写导致伪共享的并发代码 348
12.3 #93:不考虑指令级并行性 352
12.4 #94:不了解数据对齐 358
12.5 #95:不了解栈与堆 362
12.6 #96:不了解如何减少分配 369
12.7 #97:没有依赖内联 373
12.8 #98:没有使用Go 诊断工具 376
12.9 #99:不了解 GC 的工作原理 387
12.10 #100:不了解在 Docker 和 Kubernetes 中运行Go 程序的影响 392
点击下载