go第三天,高质量编程

90 阅读3分钟

各种边界条件考虑问题

异常处理

易读和易于维护

编程原则

  1. 简单性

    消除多余的复杂性

  2. 可读性

  3. 生产力

如何编写高质量的代码

代码格式

 推荐使用gofmt自动格式化代码
 常见ide都支持方便的配置
 
 goimports
 ,能够自动增删依赖包

注释

 注释应该做的
     
     注释应该解释代码作用
     

image.png

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

image.png

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

命名规范 variable i和index的命名范围都是一样的,仅仅作用为for的内部时候,index的额外冗长几乎没有增加对于程序的理解

 函数参数
     

image.png

image.png

包名的命名规范

包名只有小写字母,不包含大写字母和下划线
简单并且包换一定的上下文信息
不要与标准库同名

不适用常用变量名作为包名

使用单数而不是复数

谨慎的使用缩写。例如说fmt在不破坏上下文的情况下,更简短。

小结:

核心目标是降低阅读理解代码的成本

重点考虑上下文信息,设计简洁清晰的名称

控制流程

  1. 避免分支嵌套
  
  2. 优先处理错误和特殊情况,尽早返回或者继续循环,减少嵌套
  

小结

   线性原理,处理逻辑尽量走直线
   正常流程沿着屏幕向下走
   提高代码的可维护性和可读性
  

错误和异常处理

  简单错误
  
      指仅出现一次的错误,且在其他的地方不需要捕获该错误
      
      优先使用errors.new
      
  错误的Wrap情况
  
      使用错误去嵌套错误,生成跟踪链
      
  判断是否是指定错误
  
      erros.is
      
   取出特定种类的错误,使用errors.As
   
   
   不建议在业务中使用panic,调用函数不包含recover会造成程序崩溃
   
   若程序可以被屏蔽或解决,建议使用error
   
   
   recover
   
       recover只能在被defer的函数中使用
       
       嵌套无法生效
       
       只在当前的goroutine生效
       
       defer是先进后出
       
       如果需要跟多的上下文信息,可以使用log记录当前的调用栈
       
   小结
   
       error尽可能提供简明的上下文信息,方便定位
       
       panic使用真正的异常情况
       
       recover要注意defer的使用情况
       
       
  性能优化的前提是满足正确可靠、简洁清晰的质量因素
 
 性能优化是综合评价而不是单一指标
 
 
 性能表现需要实际数据衡量
 
 go语言提供了支持基准性能测试的benchmark工具
 

性能优化

 建议1 预分配内存
     
 建议2 使用copy代替re-slice
     
 建议3 map预分配内存
 
 建议4 使用strings.Builder 而不是+
 
 建议5 使用空结构体,节省内存
     
     空结构体不占据内存空间
 
     面对Set可以使用map,然后使用空结构体去替代bool
     
 建议6 如何使用atomic包
 
     锁的实现是通过操作系统完成的,属于系统调用
     
     atomic操作时通过硬件实现
     
     sync.Mutex应该用来保护一段逻辑,而不是变量
     
 小结
     
     避免常见的性能陷阱
     
     普通应用代码,不要一味追求性能
     
     越高级的性能优化手段越容易出现问题
     
     在满足正确,简洁清晰的前提下再去追求性能
     
     
     

性能调优

性能调优原则

依靠数据而不是猜测

要定位最大瓶颈,而不是细枝末节

不要过早优化

不要过度优化

pprof

能够知道应用耗费了多少cpu、memory

能够可视化分析

image.png