go编码规范与性能优化|青训营笔记

93 阅读3分钟

go编码规范与性能优化|青训营笔记

这是我参与「第五届青训营」笔记创作活动的第三天,回顾了之前测试的内容,同时学习了pprof工具的使用

高质量编程

  • 编程规范
    • 简介(基本要求)
      • 边界条件完备
      • 异常处理,稳定性保证
      • 易读易维护
    • 原则
      • 简单性 简单清晰的逻辑
      • 可读性
      • 生产力
  • 代码格式
    • gofmt自动格式化工具
    • goimports
  • 注释
    • 解释代码作用,如何做,为什么,什么情况出错
    • 解释代码作用
      • 适用于注释公告符号
    • 解释代码实现过程逻辑
    • 为什么要这么做
      • image.png
    • 什么时候会出错,解释代码限制条件
    • 公告符号始终都要注释
      • image.png
  • 命名规范
    • 变量命名
      • 简洁
      • 缩略词全大写,但其位于变量开头且不需要导出,使用全小写
        • eg:
          • ServerHTTP 而不是 ServeHttp
          • XMLHTTPRequest 或 xmlHTTPRequest
      • 距离使用处越远,需要携带越多信息
        • 全局变量其名字需更多上下文信息
          • 内部使用:image.png

          • 提供给外部调用时: image.png

    • 函数命名
      • 函数名不携带包名的信息
      • 尽量简短
      • 当返回类型和包名一致,可以省略类型信息
      • 返回类型个包名不一致时,可以加入
    • 包的命名
      • 只由小写字母组成,不包含大写字母和下划线
      • 不要与标准库重名
      • 使用单数,不用负数
    • 控制流程
      • 避免嵌套,保持正常流程清晰
      • 优先处理错误/特殊情况,尽早返回或继续循环来减少嵌套
    • 错误处理
      • 指仅只出现一次的错误,且其他地方不需要捕获该错误
      • 优先使用erros.New来创建匿名变量俩表示简单错误
      • fmt.Errorf 格式化
      • 错误的Wuap与Unwrap
        • image.png
        • errors.ls 判断错误链中是否有特定错误
          • image.png
        • errors.as 获取特定类型的错误
      • panic
        • 建议使用在main和init函数中
      • recover
        • eg:image.png
        • eg2:image.png
        • 只能在当前goroutine中的defer中生效。
        • defer 执行后进先出

性能优化

  • 性能指标获取
    • go test -bench="." --benchmem 测试文件 目标文件
    • 其指标内容:image.png
  • 性能优化的
    • slice
      • slice 预分配内存
      • example1:
        data:=make([]int,0)
        data=append(data,newdata)
        
        example2:
        data:=make([]int,0,size)
        data=append(data,newdata)
        //由于slice数组会自发扩容,预分配后扩容次数减少,内存操作次数减少,效率提高
        
      • slice 创建小切片
        • 建议使用copy切片产生小切片,而不是利用切片基础创建
        • 由于小切片是在原有大切片的基础上产生的,利用切片产生小切片后底层数组被引用导致底层数组无法释放
    • map
      • map预分配 原理和和slice的预分配类似
    • string的拼接
      • 拼接性能 string.Builder>bytes.Buffer>string '+'
      • image.png
    • 空结构体可以优化空间
      • 空结构体不占任何内存空间
      • 利用map实现set
        • image.png
        • 空结构体实现后map只占key的内存空间,bool 实现后 每个value可以需要占一个空间
      • atomic
        • 公用空间 用atomic包管理而不是用lock
        • eg:image.png

性能优化工具

  • pprof
    • 运行在6060端口上
    • 浏览器查看指标 :127.0.0.1:6060/debug/pprof/
    • 相关命令 【具体排查过程在熟悉命令和参数可自行实现】
      • go tool pprof 采样链接 实现信息采集
      • 在ppfrof 命令行下top 获取cpu占用排行,精确到函数
        • image.png
        • ps: 当该方法未调用其他函数 flat=cum,若只调用函数调用 flat=0;
      • list 关键词 检索相关代码并打印
      • web打开一个ui界面显示 cpu情况 需提前安装Graphviz
      • go tool pprof --http=:8080 +程序端口/.../debug/pprof/查询点 //打开ui并获取相关信息
    • 测试点:
      • 主要如下:
      • 1673966717349.jpg
      • 在pprof主页中也有统计
        • image.png

标题:高质量编程简介及编码规范 - 掘金

网址:juejin.cn/course/byte…