这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
一、高质量编程
1-高质量编程简介
问题:什么是高质量? 答:编写的代码能够达到正确、可靠、简洁清晰的目标称之为高质量的代码
要做到以下几点:
- 各种边界条件是否考虑完备
- 异常情况处理,稳定性保证
- 易读易维护
编程需做到:
- 简单性:消除多余的复杂性,以简单清晰的逻辑编写代码,因为不好理解的代码无法修复改进。
- 可读性:代码是写给人看的,而不是机器并且编写可维护代码的第一步是确保代码可读。
- 生产力:团队整体的工作效率非常重要
如何编写高质量的Go代码?需要注意:
- 代码格式:推荐使用gofmt自动格式化代码
gofmt是Go语言官方提供的工具,能自动格式化Go语言代码为官方统一风格! - 注释 其中注释应该做到以下:
- 注释应该解释代码作用
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
- 公共符号始终要注释
- 命名规范
- 核心目标是降低阅读理解代码的成本
- 重点考虑上下文信息,设计简洁清晰的名称
- 控制流程
- 避免嵌套,保持正常流程清晰,例如出去冗余的
else实例如下:
- 避免嵌套,保持正常流程清晰,例如出去冗余的
// Bad
if foo{
return x
}else{
return nil
}
// Good
if foo{
return x
}
return nil
- 尽量保持正常代码路径为最小缩进
- 故障问题的大多出现在复杂的条件语句和循环语句中
- 错误和异常处理
- 简单错误:指仅出现一次的错误,且在其他地方不需要捕获该错误
- 优先使用errors.New来创建匿名变量来直接表示简单错误
- 如果有格式化需求,则使用fmt.Errorf
func defaultCheckRedirect(req *Request, via []*Request) error {
if len(via) >= 10 {
// 使用errors.New
return errors.New("stopped after 10 redirects.")
}
return nil // 去掉不必要的else
}
错误的Wrap与Unnwrap:
- 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error跟踪链
- 在fmt.Errorf中使用
%w关键字来将一个错误关联至错误链中 实例如下:
list, _, err := c.GetBytes(cache.Subkey(a.actionID, "srcfiles"))
if err != nil {
return fmt.Errorf("reading srcfiles list: %w", err)
}
-
错误判定:
- 在错误链上获取特定种类的错误,用errors.ls
实例如下:
data, err = lockedfile.Read(targ) if errors.Is(err, fs.ErrNotExist) { return []byte{}, nil } return data, err
- 在错误链上获取特定种类的错误,用errors.ls
实例如下:
-
panic:比错误更严重,表示程序无法正常工作,不建议在项目中使用,若问题可以被屏蔽或解决,建议使用error代替panic
-
recover:只能在defer的函数中使用,他是与panic对应,如果需要更多的上下文信息可以在recover后在log中记录当前的调用栈。
二、性能调优实战
1-性能调优简介
性能调优简介:
- 性能优化的前提是满足正确可靠、简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
- 针对Go语言特性,介绍Go相关的性能优化建议
2- 性能分析工具
pprof工具的功能说明、实践应用以及采样过程和原理。