包括图片优化、前端资源优化、数据请求优化等,通过实战和测试,分析和优化任意项目中存在的性能问题;
编程原则
实际应用场景干变万化,各种语言的特性和语法各不相同但是高质量编程遵循的原则是相通的
简单性
- 消除“多余的复杂性”,以简单清晰的逻辑编写代码
- 不理解的代码无法修复改进
可读性
- 代码是写给人看的,而不是机器
- 编写可维护代码的第一步是确保代码可读
生产力
- 团队整体工作效率非常重要
编码规范
代码格式
使用gofmt自动化格式代码
goimports: Go 语言官方提供的工具,实际等于 gofmt 加上依赖包管理,自动增删依赖的包引用、将依赖包按字母序排序并分类
注释
- 注释应该做的
- 注释应该解释代码作用
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
命名规范
variable 简洁胜于冗长 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写 例如使用 ServeHTTP 而不是 ServeHttp 使用 XMLHTTPRequest 或者 xmlHTTPRequest变量距离其被使用的地方越远,则需要携带越多的上下文信息 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义
package
只由小写字母组成。不包含大写字母和下划线等字符简短并包含一定的上下文信息。例如 schema、task 等不要与标准库同名。例如不要使用 sync 或者 strings 以下规则尽量满足,以标准库包名为例 不使用常用变量名作为包名。例如使用 bufio 而不是 buf使用单数而不是复数。例如使用 encoding 而不是 encodings谨慎地使用缩写。例如使用 fmt 在不破坏上下文的情况下比 format 更加简短
简单错误
简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误优先使用 errors.New 来创建匿名变量来直接表示简单错误 如果有格式化的需求,使用 fmt.Errorf
错误的 Wrap 和 Unwrap 错误的 Wrap 实际上是提供了一个 error 嵌套另-error 的能力,从而生成一个 error 的跟踪链在 fmt.Errorf 中使用: %w 关键字来将一个错误关联至错误链中
尽可能提供简明的上下文信息链,方便定位问题error panic 用于真正异常的情况 recover 生效范围,在当前 goroutine 的被 defer 的函数中生效
slice预分配内存
使用空结构体节省内存
使用atomic包