后端基础第三天 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 3 天

第三天

高质量编程简介及编码规范

高质量编程

公共符号始终要注释

推荐使用gofmt自动化格式代码 或者 goimports = gofmt + 依赖包管理

命名规范

变量

  • 简洁
  • 缩略词全大写
  • 变量距离其背使用的地方越远,则需要携带越多的上下文信息

函数

  • 函数名尽量简短

  • 只由小写字母组成
  • 简短并包含一定的上下文信息
  • 使用单数而不是复数

控制流程

优先处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套

错误和异常处理

简单的错误

  • 简单的错误指的是仅出现一次的错误,在其他地方不需要捕获该错误
  • 优先使用 errors.New来创建匿名变量来直接表示简单错误

复杂的错误

  • Panic不建议使用,表明程序崩溃不可用
  • recover只能在被defer的函数中使用,嵌套无法生效,只在当前 goroutine生效 , defer的语句是后进先出

性能优化指南

性能表现需要实际数据衡量,Go语言提供了支持基准性能测试的 benchmark工具

go test -bench=. -benchmem

image-20230117155504424

Slice预分配内存

  • 尽可能使用 make()初始化切片时提供容量信息

image-20230117155721986

image-20230117155745257

  • 切片本质是一个数组片段的描述

    • 包括数组指针
    • 片段的长度
    • 片段的容量
  • 切片操作并不复制切片指向的元素

  • 创建一个新的切片会复用原来切片的底层数组

image-20230117155927276

扩容过程

image-20230117160002298

map预计分配内存

image-20230117160245167

字符串

常见的字符串拼接方式

image-20230117160342639

image-20230117160356638

  • 使用 + 号 拼接性能最差, strings.Builder bytes.Buffer相近,strings.Buffer更快

使用空结构体节省内存

  • 空结构体struct{}实例不占据任何的内存空间

多线程使用atomic

image-20230117161009097

小结

  • 避免常见的性能陷阱可以保证大部分程序的性能
  • 普通应用代码,不要一味地追求程序的性能
  • 越高级的性能优化手段越容易出现问题
  • 在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能

性能调优实战

性能分析工具 pprof

  • 可以知道应用在什么地方耗费了多少CPU、Memory
  • pprof是用于可视化和分析性能分析数据的工具

功能简介

image

CPU

image-20230117162319544

image-20230117162336849

堆内存

image-20230117162833656

image-20230117162852119

协程

image-20230117162937409

image-20230117163035891

image-20230117163126412

阻塞

image-20230117163157541

image-20230117163216317