Go 错误处理及性能优化小tips | 青训营笔记

80 阅读2分钟

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

Go 错误处理及性能优化小tips

最近有点累,所以今天随便写写,按理说今天很多得作图,然后我作图技巧不太好,等rpc/gorm这些不用太作图的再细节一点

错误处理

  • 仅出现一次的错误
    • 使用errors.New()来创建一个错误,如果要格式化的话,可以用fmt.Errorf()
  • 判断是否为特定错误
    • 使用errors.Is(),使用该方法可以判定错误链上的所有错误是否含有特定错误
  • 获取特定种类错误
    • 使用errors.As()
  • 恐慌panic
    • 不建议在业务中使用,因为在函数不包含recover时会造成程序崩溃
  • 恢复recover
    • rocover只能在被defer的函数中使用,且只在当前goroutine生效

性能优化小tips

  • 性能优化建议

    1. slice预分配内存:尽可能在使用make()初始化时给一些容量(cap)信息
      • 因为切片本质是一个数组片段的描述,cap不够时会新建一个数组,然后把原来的和新加的都copy过去,如👇

    image.png

    1. slice之copy替代re-slice
      • 在已有切片上re-slice不会创建新的底层数组,会使内存得不到释放
    2. map预分配:同slice预分配
      • 提前分配可减少内存拷贝和Rehash消耗
    3. 字符串拼接中,用strings.BuilderWriteString()代替+
      • 使用+每次都重新分配内存,strings.Builder底层是[ ]byte数组,采用内存扩容策略
    4. 一些场景用atomic包来代替锁
      • 锁的实现是通过操作系统来实现,属于系统调用,atomic是通过硬件实现,效率比锁高
      • sync.Mutex应该用来保护一段逻辑,而不是一个变量
    5. 可以用struct{}占位
      • 空结构体不占内存空间,所以set可以用map[type]struct{},比map[type]bool省空间