GO高质量编程和编码规范 | 青训营笔记

61 阅读3分钟

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

零、前言

本文记录和整理了本堂课容易遗忘和比较零碎的知识点,撰写本文的目的一是为了参与青训营笔记活动,二是方便自己未来查缺补漏。

一、本堂课重点内容

  • 高质量编程

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

二、详细知识点回顾

2.1 高质量编程

高质量编程简介

什么是高质量:正确可靠、简洁清晰的代码

1.各种边界条件考虑完备

2.处理异常状态,保证稳定性

3.易读易维护

编码原则

1.简单性:逻辑简单清晰

2.可读性:代码是写给人看的,函数和变量的取名能让人一眼看出其用法或功能

3.生产力:一致的编码风格,保证团队工作效率

编码规范

代码格式

使用goformat将代码格式化为官方统一风格

注释

注释应该解释代码作用

注释应该解释代码的实现过程

注释应该解释代码实现的原因

注释应该解释代码什么情况下会出错

命名规范

  1. 变量

     简洁;
    
     缩略词首字母大写,如果该变量不需要导出,使用全小写;
    
     变量的使用与其定义的地方相距过远,则使用时需要使用更多的上下文信息
     
    
  2. 函数

      函数名不需要携带包名信息;
      
      函数名尽量简短;
      
      当包名和函数返回类型冲突时(比如包名为foo,函数返回类型为Foo),可以省略信息防止产生歧义,两者不产生歧义,可以在函数名中加入类型信息。
    

package

包名只由小写字母组成,不含大写字母和下划线

简短并包含一定的上下文信息

不要与标准库同名

控制流程

如果有两个if else分支都包含return语句,则第二个控制流程可以去除冗余的else
// bad
if true{
   return x
}else{
   return y
}

//good
if true{
   return x
}
return y
线性原理:处理逻辑尽量走直线,避免复杂的嵌套分支

正常流程的代码应该是沿着屏幕往下走的

故障大部分出现在复杂的条件语句和循环语句中

错误和异常处理

  1. 简单错误

     优先使用errors.New来创建简单错误
     
     如果有格式化的要求,使用fmt.Errorf
     
    
  2. 复杂错误

    使用Wrap生成error的跟踪链
    
    在fmt.Errorf中使用%w关键字来将一个错误关联到错误链中
    
  3. 错误判断

       使用error.ls判断一个错误是否为特定的错误
       
       不同于==,该方法可以判断错误链中是否包含特定错误
       
    
if errors.Is(err, fs.ErrNotExist)
  1. panic

     不建议在业务代码中使用panic
     
     调用panic而不用recover会使程序崩溃
     
     如果问题可以解决,尝试用error代替panic
    
  2. recover

     只能在被defer的函数中使用
     
     只能在当前goroutine中生效
     
     defer的语句是后进先出的
    

总结:代码规范的核心是降低阅读代码的成本,提高代码的阅读性,帮助他人清晰理解你的代码逻辑。