Go编程规范
可以用的工具
gofmt:代码修正
goimports:修正import包规范
golint:检测规范 https://github.com/golang/lint (官方已停止支持)
Staticcheck:也是一个代码检测工具 https://staticcheck.io/
1. Comment Sentences
注释应该是一个完整的句子,有利于转化godoc
2. Declaring Empty Slices
var t []string
可避免内存分配
3. Doc Comments
包注释建议C注释风格(/* */),public函数都应该有注释
4. Don’t Panic
尽量不要使用panic处理错误
5. Error Strings
错误提示不需要开头大写也不需要句号结尾
6. Handle Errors
不要将error赋值给匿名变量_
,一定要处理error
7. Imports
import多个包时应该分组,标准库放在第一组
8. Indent Error Flow
减少正常逻辑代码的缩进
if err != nil {
// error handling
return // or continue, etc.
}
// normal code
9. Initialisms
保持首字母大写和缩写的风格,不要混用
appleID
✔ appleId
❌
10. Line Length
一行别太长
11. Mixed Caps
驼峰式命名,public大写开头,private小写开头
12. Named Result Parameters
给返回值命名
13. Package Names
全小写,要简短
14. Pass Values
除非时庞大的结构体不然别传指针
15. Receiver Names
结构体函数中接受者命名使用简短的命名风格
Client
-> c
或 cl
16. Receiver Type
如果不清楚就选指针
建议指针的情况:
- 当函数内部需要修改接受者
- 当接受者是一个结构体,且包含了
sync.Mutex
或者类似的用于同步的成员(避免拷贝) - 当接受者类型是一个结构体或数组并且很庞大(提高性能)
- 当接受者是结构体,数组或slice,并且其中的元素是指针,函数内部可能修改这些元素时
不用指针的情况:
- map,chan,func 本身就是引用类型
- slice 函数内部不会对slice进行切片或者重新分配空间
- 小型结构体,小数组,并且不需要修改里面的元素
17. Variable Names
变量命名尽可能短,尤其是局部变量
一些特殊的变量以及全局变量,可能需要更多描述,使用长命名也行
代码检查工具Staticcheck使用方法:
安装:
go get honnef.co/go/tools/cmd/staticcheck
检查当前package:
staticcheck .
检查所有package:
staticcheck ./...
check查询:
staticcheck -explain <check>