这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
前言
过完年,摸了几天🐟,今天参考教案、视频,回顾一下前几天学习的内容
高质量编程
编程原则
简单性,可读性,生产力
格式化代码
gofmt 和 goimports 在Goland的go工具 -> tool里面
Ctrl+Alt+L 可以快速缩进 这两个大部分效果差不多。。
代码注释
需要提供-外部因素,上下文,限制条件
公共符号要注释,但不需要注释实现接口的方法
解释代码什么情况会出错
命名上缩略词全大写但是位于开头不需要,并且要考虑上下文信息
- 使用
ServeHTTP而不是ServeHttp - 使用
XMLHTTPRequest而不是xmlHTTPRequest
控制流程
尽早返回,最少嵌套
错误及异常处理
优先使用 errors.New 来创建匿名变量,如果有格式化需求,使用 fmt,Errof
在 fmt.Errorf 中使用 %w 将一个错误关联至错误链中
recover() 函数可以让进入宕机 (panic) 流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,捕获当前panic就不会向上传递。在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果
defer 后进先出
性能调优
Slice
尽可能在使用make初始化切片时提供容量信息,减少内存分配次数。另一个是Slice可能会出现大内存未释放的情况(原切片较大,代码在原切片 基础上新建小切片。原底层数组在内存中有引用,得不到释放),解决的办法是可以使用copy替代re-slice重切片。
Map
类似Slice,尽可能地在make时为Map提供容量信息,减少内存拷贝和重哈希的消耗。
字符串
用string.Builder处理速度最快
- 使用‘+’号进行字符串拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快
空结构体
- 空结构体struct{}的实例不占内存空间。其中不含有任何数据,那有什么意义呢?我们常把它作为占位符使用
atomic
用atomic包的时间性能比加锁更好
- 锁的实现是通过操作系统来实现,属于系统调用,占用资源多。
- atomic操作是通过硬件实现,效率比锁高
还有性能分析工具 pprof ,还有go语言自带Benchmark
课后个人总结
本节课项目难度相较于三件套来说更加容易接受一点,但还是有很多知识点需要进一步吸收消化。