go编码规范与性能优化|青训营笔记
这是我参与「第五届青训营」笔记创作活动的第三天,回顾了之前测试的内容,同时学习了pprof工具的使用
高质量编程
- 编程规范
- 简介(基本要求)
- 边界条件完备
- 异常处理,稳定性保证
- 易读易维护
- 原则
- 简单性 简单清晰的逻辑
- 可读性
- 生产力
- 简介(基本要求)
- 代码格式
- gofmt自动格式化工具
- goimports
- 注释
- 解释代码作用,如何做,为什么,什么情况出错
- 解释代码作用
- 适用于注释公告符号
- 解释代码实现过程逻辑
- 为什么要这么做
- 什么时候会出错,解释代码限制条件
- 公告符号始终都要注释
- 命名规范
- 变量命名
- 简洁
- 缩略词全大写,但其位于变量开头且不需要导出,使用全小写
- eg:
- ServerHTTP 而不是 ServeHttp
- XMLHTTPRequest 或 xmlHTTPRequest
- eg:
- 距离使用处越远,需要携带越多信息
- 全局变量其名字需更多上下文信息
-
内部使用:
-
提供给外部调用时:
-
- 全局变量其名字需更多上下文信息
- 函数命名
- 函数名不携带包名的信息
- 尽量简短
- 当返回类型和包名一致,可以省略类型信息
- 返回类型个包名不一致时,可以加入
- 包的命名
- 只由小写字母组成,不包含大写字母和下划线
- 不要与标准库重名
- 使用单数,不用负数
- 控制流程
- 避免嵌套,保持正常流程清晰
- 优先处理错误/特殊情况,尽早返回或继续循环来减少嵌套
- 错误处理
- 指仅只出现一次的错误,且其他地方不需要捕获该错误
- 优先使用erros.New来创建匿名变量俩表示简单错误
- fmt.Errorf 格式化
- 错误的Wuap与Unwrap
- errors.ls 判断错误链中是否有特定错误
- errors.as 获取特定类型的错误
- panic
- 建议使用在main和init函数中
- recover
- eg:
- eg2:
- 只能在当前goroutine中的defer中生效。
- defer 执行后进先出
- eg:
- 变量命名
性能优化
- 性能指标获取
- go test -bench="." --benchmem 测试文件 目标文件
- 其指标内容:
- 性能优化的
- 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 '+'
- 空结构体可以优化空间
- 空结构体不占任何内存空间
- 利用map实现set
- 空结构体实现后map只占key的内存空间,bool 实现后 每个value可以需要占一个空间
- atomic
- 公用空间 用atomic包管理而不是用lock
- eg:
- slice
性能优化工具
- pprof
- 运行在6060端口上
- 浏览器查看指标 :127.0.0.1:6060/debug/pprof/
- 相关命令 【具体排查过程在熟悉命令和参数可自行实现】
- go tool pprof 采样链接 实现信息采集
- 在ppfrof 命令行下top 获取cpu占用排行,精确到函数
- ps: 当该方法未调用其他函数 flat=cum,若只调用函数调用 flat=0;
- list 关键词 检索相关代码并打印
- web打开一个ui界面显示 cpu情况 需提前安装Graphviz
- go tool pprof --http=:8080 +程序端口/.../debug/pprof/查询点 //打开ui并获取相关信息
- 测试点:
- 主要如下:
- 在pprof主页中也有统计
标题:高质量编程简介及编码规范 - 掘金