这是我参与「第五届青训营」伴学笔记活动的第三天。 首先第一节难点在于error,panic以及recover的使用
1.高质量编程
注释
解释作用,使用原因,限制条件等
(1)公共符号加注释
(2)不明显不简短的公共功能也不注释。
(3)任何函数都要注释,接口不用注释
(4)自动格式化工具gofmt,goimport。
命名规范
(1)简洁,不是变量开头且不导出的缩略词要全大写,与使用模块间隔远时需要包含上下文信息。
(2)函数,package名简短,包含信息且不与标准库及库函数重名。
控制流程
(1)避免嵌套,比如有了return可以省去else (2)正常代码路径为最小缩进。优先处理错误情况和特殊情况。
错误和异常处理
(1)优先使用errors.New来创建匿名变量直接表示简单错误。格式化需求fmt.errorf wrap可以用error嵌套另一个error从而生成跟踪链。在fmt.Error中通过%w关键字将一个错误关联至错误链中
_,err:=get()
if err!=nil{
return fmt.Errorf("related:%w",err)
}
(2)判定一个错误是否为特定错误使用errors.ls以判断错误链所有错误是否含有特定错误
_,err:=funtion()
if errors.ls(err,fs.ErrNotExist){
return nil
}
(3)特定种类错误,使用errors.As查找
if err!=nil{
if errors.As(err,&pathError){
fmt.println("...",pathError.Path)
}
}
(4)如果函数没有recover使用panic会造成崩溃,因此若错误可以解决则用error,否则不可逆错误用panic recover。recover在defer中使用,defer按照后进先出的规则,嵌套时无法使用,且只在当前goroutine中生效。
defer func (){
if a:=recover();e!=nil{
if {.....
}else{
panic(e)
}
}
}
recover把出现panic的上下文记录下来,进而可以把调用栈打印出来。
2.性能优化
通过benchmark工具进行性能测试。
func BenchmarkXxx(b*testing.B){
......}
通过go test -bench=.文件名-benchmen完成测试+++ 在结果中后四个依次表示执行次数,每次花费时间,每次申请的内存,每次申请几次内存 (5)slice预分配内存 使用make()初始化应提供容量
data:=make([]int,0
创建新切片会服用原来切片的底层数组。因此可能不会释放,一般用copy替代re-slice (6)map空间尽量初始化确定 (7)z
3.性能调优
这里主要解决最大瓶颈,既不能过早也不能过度。
pprof工具
(1)topN查看占用资源最多的函数。在资源表中flat代表函数自身cpu消耗,而cum表示本身和调用函数的一共消耗。因此flat与cum表示无调用函数而等于零表示只调用了其他函数。
(2)list Eat查找函数问题处
(3)web可以调出资源列表并可视化调用关系,从而帮助我们注释相关代码
(4)sample里有四种采样说明,alloc_object表示累计申请对象数,space为累计内存,inuse——objecct表示当前持有对象数,space为当前占用内存大小
(5)查看协程用 go tool pprof ——http=:....../goroutine,一般用火焰图分析,从上到下为调用顺序,每一块表示一个函数越长占用cpu时间越长
总结
今天的课程内容比较少,但是依然缺乏足够的实战,很多概念只是字面上的理解,而且课程的实战项目也仅仅只是了解一个大体的过程,很多问题我还没有完全弄懂,或者一些老师没有说明的功能我也没有全部查看。总而言之继续加油。