Go 高质量编程与性能调优 | 青训营笔记

61 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

高质量编程简介及编码规范

  • 如何编写更简洁清晰的代码
  • 常用Go语言程序优化手段
  • 熟悉Go程序性能分析工具
  • 了解工程中性能优化的原则和流程

01.高质量编程

  • 高质量编程简介
  • 编码规范性能优化建议

1.1 简介

  • 各种边界条件是否考虑完备
  • 异常情况处理
  • 稳定性保证易读易维护

1.2 编码规范

  • 代码格式
  • 注释命名规范
  • 控制流程
  • 错误和异常处理

1.2.1 编码规范-代码格式

使用gofmt自动格式

1.2.2 编码规范-注释

注释适合公共符号

适当提供额外上下文

解释限制条件

注释应该做的

  • 注释应该解释代码作用
  • 注释应该解释代码如何做的
  • 注释应该解释代码实现的原因
  • 注释应该解释代码什么情况会出错

1.2.3 命名规范

简洁胜于冗长

缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写

  • 例如使用ServeHTTP而不是ServeHttp 使用XMLHTTPRequest或者xmlHTTPRequest

变量距离其被使用的地方越远,则需要携带越多的上下文信息

  • 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义

函数命名

  • 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
  • 函数名尽量简短
  • 当名为foo的包某个函数返回类型Foo时,可以省略类型信息而不导致歧义
  • 当名为foo的包某个函数返回类型T时(T并不是Foo),可以在函数名中加入类型信息

包命名

  • 只由小写字母组成。不包含大写字母和下划线等字符
  • 简短并包含一定的上下文信息。例如schema、task等
  • 不要与标准库同名。例如不要使用sync或者strings

以下规则尽量满足,以标准库包名为例

  • 不使用常用变量名作为包名。例如使用bufio而不是buf
  • 使用单数而不是复数。例如使用encoding而不是encodings
  • 谨慎地使用缩写。例如使用 fmt 在不破坏上下文的情况下比 format 更加简短

1.2.4 控制流程

减少if嵌套

if 控制在两个及以内

线性原理,逻辑走直线

1.2.5 错误和异常处理

  • 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
  • 优先使用 errors.New 来创建匿名变量来直接表示简单错误
  • 如果有格式化的需求,使用fmt.Errorf

02性能调优实战

  • 性能调优简介
  • 性能分析工具pprof实战
  • 性能调优案例