高质量编程学习笔记(1)| 青训营笔记

188 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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块中

image.png

image.png

Initialisms

  • 一个已经是缩写的名词应有大小写一致性(URL/url,HTTP/http)

Interface

  • Go接口通常属于使用接口类型值的包,而不是实现这些值的包。实现包应该返回具体的(通常是指针或结构)类型,这样,就可以向实现中添加新方法,而不需要进行广泛的重构。
  • 不要在使用接口前定义接口,接口通过模仿具体的实例类型进行构建(先了解这个模板类的共同特点,然后再构建类模板)