这是我参与「第五届青训营 」伴学笔记创作活动的第4天
Go 错误处理及性能优化小tips
最近有点累,所以今天随便写写,按理说今天很多得作图,然后我作图技巧不太好,等rpc/gorm这些不用太作图的再细节一点
错误处理
- 仅出现一次的错误
- 使用
errors.New()来创建一个错误,如果要格式化的话,可以用fmt.Errorf()
- 使用
- 判断是否为特定错误
- 使用
errors.Is(),使用该方法可以判定错误链上的所有错误是否含有特定错误
- 使用
- 获取特定种类错误
- 使用
errors.As()
- 使用
- 恐慌
panic- 不建议在业务中使用,因为在函数不包含recover时会造成程序崩溃
- 恢复
recover- rocover只能在被defer的函数中使用,且只在当前goroutine生效
性能优化小tips
-
性能优化建议
- slice预分配内存:尽可能在使用
make()初始化时给一些容量(cap)信息- 因为切片本质是一个数组片段的描述,cap不够时会新建一个数组,然后把原来的和新加的都copy过去,如👇
- slice之copy替代re-slice
- 在已有切片上re-slice不会创建新的底层数组,会使内存得不到释放
- map预分配:同slice预分配
- 提前分配可减少内存拷贝和Rehash消耗
- 字符串拼接中,用
strings.Builder的WriteString()代替+- 使用
+每次都重新分配内存,strings.Builder底层是[ ]byte数组,采用内存扩容策略
- 使用
- 一些场景用atomic包来代替锁
- 锁的实现是通过操作系统来实现,属于系统调用,atomic是通过硬件实现,效率比锁高
sync.Mutex应该用来保护一段逻辑,而不是一个变量
- 可以用struct{}占位
- 空结构体不占内存空间,所以set可以用
map[type]struct{},比map[type]bool省空间
- 空结构体不占内存空间,所以set可以用
- slice预分配内存:尽可能在使用