这是我参与「第五届青训营」伴学笔记创作活动的第3天。
学习目标:如何完成高质量编码
即各种边界条件是否考虑完备、 异常情况处理,稳定性保证、 易读易维护
编程原则:简单性、可读性、生产力
编码规范
代码格式
使用gofmt或foimports自动格式化代码
注释
注释应该提供代码未表达出的上下文信息
命名规范
核心目标是降低阅读理解代码的成本 重点考虑上下文信息,设计简洁清晰的名称
控制流程
避免嵌套,保持正常流程清晰 尽量保持正常代码路径为最小缩进
ps:故障问题大多出现在复杂的条件语句与循环语句中
错误与异常处理
简单错误
只出现一次,优先使用errors.New来创建匿名变量直接表示
错误的Wrap和Unwrap
生成一个error的跟踪链,在fmt.Errorf中用%w关键字关联起错误链
错误判定
判定特定错误用errors.Is(err,fs) 获取特定错误用errors.As(err,&p)
recover
只能在被defer的函数使用
嵌套无法生效
只在当前goroutine生效
defer语句是后进先出
性能优化建议
Benchmark
使用方法:go test -bench=. —benchmem 意义:测量和评估软件性能指标的活动
Slice
尽可能的在使用make()初始化切片时提供容量信息 意义:预分配内存 声明:make([]int,0,size)
Map
声明:make(map[int]int,size) 意义:提前分配好空间可以减少内存拷贝和Rehash的消耗
字符串处理
使用strings.Builder 每次使用+都要重新分配内存,而strings.Builder,bytes.Buffer底层都是[]byte数组
空结构体
空结构体struct{}实例不占据任何内存 可作为各种场景下的占位符使用
atomic包
atomic操作通过硬件实现,效率比锁高