这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
《Go 代码 Review 建议》阅读心得:
gofmt:自动简化代码
用法:gofmt [flags] [path]
- 去除不必要的括号: gofmt -r '(a) -> a' -w *.go
- 自动简化 gofmt -s [path]
Comment sentences
- 注释应该以要注释的对象名起头,以“.”结尾,并且尽可能的全面。
Contexts
- 通常函数调用应将context类型的参数放在第一个位置。
- 不随便使用context.Background()
- 不要在结构体中添加context成员,而是在需要传递CTX参数的类型上的每个方法中添加一个CTX参数。
copying
- 不要复制一个绑定了指针类型方法的值。
Crypto rand
- 不要使用math/rand生成密匙,因为这产生的值是可预测的。
- 建议使用crypto/rand的reader并生成16进制或base64类型编码。
Declaring Empty Slices
- 定义空切片使用var t=[]string 而不是t:=[]string{},前者初始化是nil而后者是零值,在编码json文件时会有差异,在定义接口时避免混用两种形式。
Don't panic
- 对于一般错误不要使用panic,是用error和多个返回值
Error Strings
- Error字符串不应该大写,末尾也不要有标点(我喜欢写“ERROR!”,精准踩坑)
Examples
- 在引入一个包时,解释作用,或者用一段简单的测试演示调用步骤
Goroutine Lifetimes
- 对线程的生存期要负责,即使管道堵塞,garbage collector也不会自动清理相关线程,会造成内存泄漏。
- 并发代码尽可能简洁使线程生存期一目了然,否则,以文档形式记录。
Handle Errors
- 不要用 _ 接收error,老老实实处理error,检测error,必要时panic
imports
- 将引用分组,中间以空行分隔,区分标准包和外部包
In-Band Errors
- c语言中返回错误习惯性使用-1或null,在go中,利用函数可以返回多个值的特性,对需要判断函数调用是否成功的的函数,建议返回一个bool值,并在调用函数后handle error。
Indent Error Flow 在处理错误时,为了保证正常代码缩进尽可能少,不要其放在else块中
Initialisms
- 一个已经是缩写的名词应有大小写一致性(URL/url,HTTP/http)
Interface
- Go接口通常属于使用接口类型值的包,而不是实现这些值的包。实现包应该返回具体的(通常是指针或结构)类型,这样,就可以向实现中添加新方法,而不需要进行广泛的重构。
- 不要在使用接口前定义接口,接口通过模仿具体的实例类型进行构建(先了解这个模板类的共同特点,然后再构建类模板)