高质量编程 | 青训营笔记

69 阅读3分钟

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

一、高质量编程

1、简介

高质量编程指编写的代码能够达到正确可靠、简洁清晰的目标,考虑各种边界条件是否完备、异常情况处理、代码易读易维护。

原则:简单性、可读性、生产力

2、编码规范

1)代码格式

可以使用gofmtgoimports自动格式化代码
goimports相当于gofmt加上依赖包管理

2)注释

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

3)命名规范

变量:
简洁胜于冗长
缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
变量距离其被使用的地方越远,则需携带越多的上下文信息
当变量缩写与否不影响语义时,优先缩写,如iindex;否则优先满足语义 函数:
函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
函数名应尽量简短
当名为foo的包某个函数返回类型Foo时,可以省略类型信息而不导致歧义
当名为foo的包某个函数返回类型T时,可以在函数名中加入类型信息

只由小写字母组成,不包含大写字母和下划线等字符
简短并包含一定的上下文信息,如schematask
不要与标准库同名,如不要使用sync或者strings
不使用常用变量名作为包名,如使用bufio而不是buf
使用单数而不是复数,如使用encdoing而不是encodings
谨慎使用缩写,如使用fmt在不破坏上下文的情况下比format更简短

4)控制流程

避免嵌套,保持正常流程清晰
尽量保持正常代码路径为最小缩进
优先处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套

5)错误和异常处理

简单错误

简单错误指仅出现一次的错误,且在其他地方不需要捕获该错误
优先使用errors.New来创建匿名变量来直接表示简单错误

错误的Wrap和Unwrap

错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成了一个error跟踪链
可以在fmt.Errirf中使用:%w关键字来将一个错误关联至错误链中

错误判定

判定一个错误是否为特定错误,使用error.Is
不同于使用==,使用该方法可以判定错误链上所有错误是否含有特定错误
在错误链上获取特定种类的错误,使用error.As

panic

panic会使程序停止运行,在panic所在函数运行到panic时,会以倒序运行defer内容,然后宕机。
不建议在业务代码中使用panic,若问题可以被屏蔽或解决,建议使用error代替panic

recover

recover仅在延迟函数defer中有效,用于恢复宕机的程序,使其继续运行
panicrecover组合有如下特性:
panicrecover,程序宕机
panic也有recover,程序不会宕机,执行完对应的defer后,从宕机点退出当前函数后继续执行