[高质量代码笔记|青训营笔记]

95 阅读3分钟

这是我参与「第五届青训营」伴学笔记活动的第三天。 首先第一节难点在于error,panic以及recover的使用

1.高质量编程

注释

解释作用,使用原因,限制条件等

(1)公共符号加注释

(2)不明显不简短的公共功能也不注释。

(3)任何函数都要注释,接口不用注释

(4)自动格式化工具gofmt,goimport。

命名规范

(1)简洁,不是变量开头且不导出的缩略词要全大写,与使用模块间隔远时需要包含上下文信息。

(2)函数,package名简短,包含信息且不与标准库及库函数重名。

控制流程

(1)避免嵌套,比如有了return可以省去else (2)正常代码路径为最小缩进。优先处理错误情况和特殊情况。

错误和异常处理

(1)优先使用errors.New来创建匿名变量直接表示简单错误。格式化需求fmt.errorf wrap可以用error嵌套另一个error从而生成跟踪链。在fmt.Error中通过%w关键字将一个错误关联至错误链中

   _,err:=get()
   if err!=nil{
       return fmt.Errorf("related:%w",err)
      }

(2)判定一个错误是否为特定错误使用errors.ls以判断错误链所有错误是否含有特定错误

   _,err:=funtion()
   if errors.ls(err,fs.ErrNotExist){
            return nil
            }

(3)特定种类错误,使用errors.As查找

  if err!=nil{
      if errors.As(err,&pathError){
           fmt.println("...",pathError.Path)
      }
   }

(4)如果函数没有recover使用panic会造成崩溃,因此若错误可以解决则用error,否则不可逆错误用panic recover。recover在defer中使用,defer按照后进先出的规则,嵌套时无法使用,且只在当前goroutine中生效。

   defer func (){
      if a:=recover();e!=nil{
          if {.....
        }else{
        panic(e)
        }
       } 
     }

recover把出现panic的上下文记录下来,进而可以把调用栈打印出来。

2.性能优化

通过benchmark工具进行性能测试。

func BenchmarkXxx(b*testing.B){
......}

通过go test -bench=.文件名-benchmen完成测试+++ 在结果中后四个依次表示执行次数,每次花费时间,每次申请的内存,每次申请几次内存 (5)slice预分配内存 使用make()初始化应提供容量

 data:=make([]int,0

创建新切片会服用原来切片的底层数组。因此可能不会释放,一般用copy替代re-slice (6)map空间尽量初始化确定 (7)z

3.性能调优

这里主要解决最大瓶颈,既不能过早也不能过度。

pprof工具

(1)topN查看占用资源最多的函数。在资源表中flat代表函数自身cpu消耗,而cum表示本身和调用函数的一共消耗。因此flat与cum表示无调用函数而等于零表示只调用了其他函数。

(2)list Eat查找函数问题处

(3)web可以调出资源列表并可视化调用关系,从而帮助我们注释相关代码

(4)sample里有四种采样说明,alloc_object表示累计申请对象数,space为累计内存,inuse——objecct表示当前持有对象数,space为当前占用内存大小

(5)查看协程用 go tool pprof ——http=:....../goroutine,一般用火焰图分析,从上到下为调用顺序,每一块表示一个函数越长占用cpu时间越长

总结

今天的课程内容比较少,但是依然缺乏足够的实战,很多概念只是字面上的理解,而且课程的实战项目也仅仅只是了解一个大体的过程,很多问题我还没有完全弄懂,或者一些老师没有说明的功能我也没有全部查看。总而言之继续加油。