该页面收集了对 Go 进行代码评审时的常见评论和其内涵,利用它们可以做到言简意赅。注意这是常见错误的清单,而不是风格指南。您可以将其视为Effective Go的补充。
- Gofmt
- Comment Sentences
- Contexts
- Copying
- Crypto Rand
- Declaring Empty Slices
- Doc Comments
- Don't Panic
- Error Strings
- Examples
- Goroutine Lifetimes
- Handle Errors
- Imports
- Import Dot
- In-Band Errors
- Indent Error Flow
- Initialisms
- Interfaces
- Line Length
- Mixed Caps
- Named Result Parameters
- Naked Returns
- Package Comments
- Package Names
- Pass Values
- Receiver Names
- Receiver Type
- Synchronous Functions
- Useful Test Failures
- Variable Names
Gofmt
在代码上运行 gofmt 以自动修复大多数机械样式问题。几乎所有 Go 代码都在使用 gofmt。本文档的其余部分讨论非机械式样点。
另一种方法是使用 goimports,这是 gofmt 的超集,它根据需要额外添加和删除导入行。
Comment Sentences
参考effective go 文档,对声明的注释应该是完整的句子,即使这看起来有点多余。这种方法使通过 godoc 提取文档时格式良好。评论应以所描述事物的名称开始,并以句点结束:
// Request represents a request to run a command.
type Request struct { ...
// Encode writes the JSON encoding of req to w.
func Encode(w io.Writer, req *Request) { ...
请注意,除句号之外还有其他符号可以作为句子的有效结尾(比如!、?)。
Contexts
context.Context 类型的值包含跨越 API 和进程边界的安全证书,跟踪信息,截止日期和取消信号。 Go 程序将整个函数调用链中的传入 RPC 和 HTTP 请求显式地传递给传出请求。
大多数使用 Context 的函数都应该接受它作为第一个参数:
func F(ctx context.Context, /* other arguments */) {}
一个永远不需要特定请求的函数可能会使用 context.Background(),但默认情况下应该传一个 Context; 只有你有充分的理由说明替代方案又问题,才能使用 context.Background()。
不要将 Context 添加到结构类型中,而是将 ctx 参数添加到需要传递该类型的每种方法上。唯一例外的情况是方法的签名必须与标准库或第三方库中的接口相匹配。
不要自定义 Context 类型,也不要扩展 Context 接口之外的方法。如果你有应用数据需要传递,利用参数、接收器、全局变量,如果只能通过 Context 传,使用 Context Value。
Context 是不可变的,因此可以将相同的 ctx 传递给多个调用,让它们共享相同的截止日期,取消信号,安全证书,父级跟踪等的。
(未完结,持续更新中)
网友评论