Go语言高质量编程(1)

82 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天,初步学习了Go语言高质量编程的部分知识

在编写Go代码的过程中,在实现需求的同时,也要保证代码的质量,即保证编写的代码能够达到正确可靠、简洁清晰,这样才能满足:

  1. 对于任何合理的输入能返回对应的输出,对于非法的输入能够保证程序不会宕掉且能输出相应的提示信息
  2. 保证代码易阅读,当他人对程序进行二次开发时能够快速理解程序所做的事情并且对其进行进一步的开发或者维护

高质量的代码基本满足简单性、可读性和生产力。简单性及保证代码功能实现的情况下对代码变量、函数等命名以及其他方面进行简单化。可读性是为了后续方便代码的维护,而生产力则是团队协作的过程中注重的

编写高质量代码从以下几个方面入手

  • 代码格式
  • 注释
  • 命名规范
  • 控制流程
  • 错误和异常处理
代码格式

目前主要用于规范代码格式的有gofmt和goimports,前者在目前主流的IDE都已包含,而goimports则是在gofmt的基础上加上了包管理,即不需要开发者手动的导入或删除包,程序会在保存时自动删除程序中未使用的包,会自动导入需要的包。设置的方法就是在IDE中找到设置,里面搜索gofmt或者代码规范等,一般默认为gofmt,将其修改为goimports即可,IDE会自动下载goimports工具

注释

注释需要做到以下要求

  1. 注释代码的作用以及简述其实现过程和原因
  2. 对于一些报错的输入要在注释中说明
  3. 一般来说,对于包中可导出或者公用的变量、函数、方法都要进行注释,并且对方法内部的一些比较复杂的实现也要注释
命名规范
  1. 局部变量或使用范围短的变量应在表明其含义的基础上尽可能简短,而全局变量或者使用范围大的变量需要携带多的上下文信息,方便在使用时能够快速知道其含义
  2. 当函数的返回值等于包名时则名字中可以省略类型信息,否则需要带上
  3. 对于包的命名,一是全部由小写字母组成并且包含一定的上下文信息。二是不能和标准库的包名相同且不能使用变量名来当作包名,避免引起歧义。
控制流程

在书写if...else...和for等流程控制语句时,要尽可能的少使用嵌套,避免代码阅读的难以阅读和出错时排查错误的困难。对于有可能出错的逻辑,不要在多层嵌套之中返回正确的返回值,而是遇到错误就提前返回,直到排除所有异常情况后再返回正确的输出,这样最多只会有三层嵌套,多数为一层或两层嵌套

错误和异常处理

在Go语言中错误error和异常panic是有区别的。

error是程序处理中比较多出现的,当出现一个错误时,程序仍然能够正常运行下去,我们只需要将错误打包返回或者在日志中输出即可。

但当出现panic时,程序会直接宕掉,因此在业务代码中不建议使用panic。对于调用的包或者不可避免出现panic时,需要使用recover来进行异常捕获保证程序的顺序执行

其中,recover需要注意

  • recover只能在defer的函数中使用,即

     defer func() {
         e := recover()
         //......
     }
    
  • defer中嵌套的函数使用recover或者直接在defer后面跟上recover是不会生效的

  • recover只会在当前的goroutine有效,不会捕获其他协程的panic

  • defer的执行顺序和栈相似,是先进后出