1.1 高质量 高质量编码是编写的代码能够达到正确可靠、简介清晰的目标可称为高质量
满足以下几点
1简单性
2可读性
3生产力
1.2编码规范
1.2.2注释
1.2.1 代码格式
使用工具自动格式化代码: gofmt
1.2.2注释
1解释代码作用
2解释代码如何做的
3解释代码实现的原因
4解释代码什么情况会出错
1.2.3命名规范
1简洁剩余冗长
2缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
例如:ServeHTTP而不是ServeHttp XMLHTTPRequest或xmlHTTPRequest
3变量距离其被使用的地方越远,则需要携带越多的上下文信息
1.2.4控制流程
避免嵌套,保持正常流程清晰
正常流程代码沿着屏幕向下移动
提升代码可维护性和可读性
故障问题大多出现在复杂的条件语句和循环语句中
1.2.5错误和异常处理
(1)简单错误
1.简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
2.优先使用errors.New来创建匿名变量来直接表示简单错误
3.如果有格式化的需求,使用fmr.Errorf
(2)错误的Wrap和Unwrap
1.错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
2在fmt.Errorf中使用:%w关键字来将一个错误关联至错误链中
(3)错误判定
判定一个错误是否为特定错误,使用error.Is
不同于使用==,使用该方法可以判断错误链上的所有错误是否含有特定的错误
在错误链上获取特定种类的错误,使用error.As
**(4)Panic **
不建议在业务代码中使用panic
调用函数不包含recover会造成程序崩溃
若问题可以被屏蔽或解决,建议使用error代替panic
当程序启动阶段发生不可逆的错误时,可以在init或main函数中使用panic
(5)recover
recover只能在被defer的函数中使用
嵌套无法生效
只在当前goroutine生效
defer的语句时后进先出
如果需要更多的上下文信息,可以recover后在log中记录当前的调用栈
小结
erro尽可能提供简明的上下文信息链,方便定位问题
panic用于真正异常的情况
recover生效范围,在当前goroutine的被defer的函数中生效
例子
func Now() Time
func NowTime() Time
t := time.Now()
t := time.NowTime()
这里用func Now()更加简洁更适合
func Parse(s string)(Duration, error) //这个容易被误解
func ParseDuration(s string)(Duration ,error) //这个详细
duration := time.Parse(s)
duration := time.ParseDuration(s)