100个Go语言典型错误

1 Go:入门容易,掌握难

1.1 Go 大纲

1.2 简单并不意味着容易

1.3 100 个 Go 错误

1.4 本章总结

2 代码和项目组织

2.1 意外的阴影变量

2.2 不必要的嵌套代码

2.3 滥用的 init 函数

2.4 过度使用 getters 和 setters

2.5 接口污染

2.6 在生产者端的接口

2.7 返回接口

2.8 any say nothing

2.9 令人困惑的泛型

2.10 没有意识到类型嵌入可能存在的问题

2.11 不使用函数式选项模式

2.12 项目组织不善

2.13 创建公共包

2.14 忽略软件包名称冲突

2.15 缺少代码文档

2.16 不使用代码检查工具

3 数据类型

3.1 与八进制文字混淆

3.2 忽略整数溢出

3.3 不被理解的浮点型

3.4 不被理解的切片长度和容量

3.5 低效的切片初始化

3.6 令人困惑的切片,nil vs 空切片

3.7 没有正确检查切片是否为空

3.8 无法正确复制切片

3.9 使用切片附加的意外副作用

3.10 切片与内存泄漏

3.11 低效的 map 初始化

3.12 映射和内存泄漏

3.13 错误的比较值

4 控制结构

4.1 在 range 循环中不被重视的元素副本

4.2 在 range 循环中被忽视的参数求值方式

4.3 在 range 循环中使用指针元素被忽略的影响

4.4 在 map 迭代过程中做出错误的假设

4.5 忽略 break 语句的工作方式

4.6 在循环中使用 defer

5 字符串

5.1 Go 中超难理解的符文(runes)概念

5.2 字符串中有捣乱格式的字符,导致的字符串迭代混乱

5.3 被滥用的 trim 函数

5.4 欠优化的字符串连接

5.5 无用的字符串转换

5.6 子字符串与内存泄漏

6 函数与方法

6.1 接收器应该定义为值类型还是指针类型?

6.2 什么时候使用返回值参数

6.3 定义返回值参数的坑

6.4 返回一个 nil 接收器引发的坑爹事件

6.5 不要使用文件名作为函数参数

6.6 defer 函数中参数和接收器是如何被赋值的

7 错误管理

7.1 恐慌(panicking)

7.2 被忽略的包装(wrap)错误

7.3 错误类型比较的坑

7.4 错误值比较的坑

7.5 重复处理了两次错误

7.6 忽略错误,引入的坑

7.7 不处理 defer 的错误,引入的坑

8 并发:基础

8.1 并发和并行,傻傻分不清楚

8.2 并发并不总是更快

8.3 并发业务应该使用 channel 还是 mutex

8.4 竞争问题引入的坑

8.5 goroutines 数量取决于工作负载类型

8.6 令人头大的 Go 上下文

9 并发:实践

9.1 传递不恰当的上下文

9.2 goroutine 已启动,啥时候停,不确定

9.3 goroutine 和循环变量,一不小心就出错

9.4 期望使用 select 和 channel 的确定性执行

9.5 不要使用布尔类型的通道

9.6 不要使用零值通道

9.7 通道缓冲区尺寸引入的坑

9.8 忘记字符串格式化引入的坑

9.9 append 数据引发的数据竞争

9.10 切片和 map 使用互斥锁引入的坑

9.11 使用 sync.WaitGroup 引入的坑

9.12 被遗忘的 sync.Cond

9.13 多个 goroutine 并行执行,使用 errgroup 聚合返回错误

9.14 拷贝同步类型变量引入的坑

10 标准库

10.1 提供错误的时间周期(time Duration)

10.2 time.After 引发的内存泄漏

10.3 JSON 编码和解码引入的坑

10.4 SQL 类库的常见错误

10.5 瞬态资源一定要关闭

10.6 回复 HTTP 请求后忘记调用 return 语句

10.7 不要使用默认的 HTTP 客户端和服务器

11 测试

11.1 测试也需要分类

11.2 启用 race 标志检查是否存在数据竞争

11.3 测试的 parallel 与 shuffle 模式

11.4 表驱动测试,简化测试代码的神器

11.5 在单元测试中使用 sleep 引入的坑

11.6 测试不稳定,都是 time API 在捣乱

11.7 原生测试包,好处多

11.8 测试代码中编写不准确的基准

11.9 没有探索所有的 Go 测试特性

12 优化

12.1 基于 CPU 缓存的优化

12.2 并发代码导致 CPU 缓存的虚假共享

12.3 CPU 指令级并行性对程序的优化

12.4 数据在内存中对齐,有什么好处

12.5 逃逸分析到底是啥

12.6 减少内存分配对程序的优化

12.7 Go 语言的内联优化

12.8 pprof 诊断工具

12.9 Go 的垃圾回收是如何工作的

12.10 Docker 和 Kubernetes 内部机制对 Go 程序的影响

相关推荐
两点王爷1 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷1 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技1 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
C++ 老炮儿的技术栈2 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程2 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
TDengine (老段)3 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
zr想努力3 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣4 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1114 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪4 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring