一、高质量编程
1、什么是高质量代码?
编写的代码能够达到正确可靠运行,简明清晰易懂,无性能隐患这三个目标便可称之为高质量代码,也可以简单概括为三个原则:简单性,可读性,生产力。
2、代码格式规范
使用fmt自动格式化代码,保证整个程序的代码编写规范与官方推荐的格式一致。
提升可读性,编写规范,注释清晰,风格一致的代码更有利于维护和团队的后来者学习阅读,降低维护成本。
3、命名规范
•变量命名:缩略词全大写而非只大写首字母,但当其位于开头时全小写,如:ServeHTTP而非ServeHttp;变量距离使用位置越远,就需要携带越多上下文信息,以便判断其位置和用途。
•函数命名:函数名尽量不携带包名的上下文信息,因为其总是成对出现的;函数名要尽可能简短,方便阅读和记忆;当名为foo的包返回类型为foo时,可以省略其类型名称避免导致歧义。
4、包的命名
•只用小写字母命名,不包含大写字母和下划线等字符,名称简短。
•不能与标准库同名。
二、错误捕获与处理
1、简单错误处理
简单的错误指的是仅出现一次的错误,而且在别的地方可以不用捕获该错误。
优先使用errors.new(“error info”)这样的匿名消息来处理简单错误
如果有格式化的要求则使用fmt.Errorf
如:
`fmt.Errorf("正在处理错误%d", 20036)`
2、复杂错误处理
错误的warp实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链。如何理解跟踪链呢,也就是类似于JAVA里面异常处理的机制,当发生异常时,异常会一层层地向上抛,直到它被捕获并且处理。 在fmt.Errorf中使用%w关键字来将一个错误关联至错误链中。
错误判定:判定一个错误是否为特定错误,使用Error.Is,不同于使用== ,使用该方法可以判定错误链上的所有错误是否含有特定的错误。
特定错误获取:在错误链上获取特定种类的错误,使用errors.As
panic,不建议在业务代码中使用panic,调用函数不包含recover会造成程序崩溃,若问题可以被屏蔽解决,建议使用error代替panic
当程序启动阶段发生不可逆转的错误时,可以在init或main函数中使用panic
recover机制:只能在被defer的函数中使用,嵌套无法生效,只在当前的goroutine生效.
defer语句:defer是后进先出的,我们来看一个例子
`func test() {
if true {
defer fmt.Println("1")
} else {
defer fmt.Println("2")
}
defer fmt.Println("3")
}
//输出的结果是:
//3
//1
//代码解析:首先首先是先进到了1所对应的defer中,然后最后进到了3所对应的defer中,根据后进先出原则,先执行3,再执行1`