译者:baiyutang
原文:https://dmitri.shuralyov.com/idiomatic-go#use-singular-form-for-collection-repo-folder-name
使用一致的拼写某些单词
这样:
// marshaling
// unmarshaling
// canceling
// canceled
// cancellation
复制代码
不要这样:
// marshalling
// unmarshalling
// cancelling
// cancelled
// cancelation
复制代码
为了 Go 项目的一致性,这些词有多种有效地拼法,选一个 Go 项目,参看 https://golang.org/wiki/Spelling
句子之间一个空格
这样:
// Sentence one. Sentence two.
复制代码
不要这样:
// Sentence one. Sentence two.
复制代码
Go 风格的一致性,参看 CL 20022。
变量式命名 Eroor
这样:
// Package level exported error.
var ErrSomething = errors.New("something went wrong")
func main() {
// Normally you call it just "err",
result, err := doSomething()
// and use err right away.
// But if you want to give it a longer name, use "somethingError".
var specificError error
result, specificError = doSpecificThing()
// ... use specificError later.
}
复制代码
不要这样:
var ErrorSomething = errors.New("something went wrong")
var SomethingErr = errors.New("something went wrong")
var SomethingError = errors.New("something went wrong")
func main() {
var specificErr error
result, specificErr = doSpecificThing()
var errSpecific error
result, errSpecific = doSpecificThing()
var errorSpecific error
result, errorSpecific = doSpecificThing()
}
复制代码
保持一致性,参看 https://talks.golang.org/2014/names.slide#14.
多个大写字母的专有名词或单词,所有字母小写
这样:
// Exported.
var OAuthEnabled bool
var GitHubToken string
// Unexported.
var oauthEnabled bool
var githubToken string
复制代码
不要这样:
// Unexported.
var oAuthEnabled bool
var gitHubToken string
复制代码
人为注释永远有一个空格在斜杠后面
这样:
// This is a comment
// for humans.
复制代码
不要这样:
//This is a comment
//for humans.
复制代码
为了一致性,无空格风格被程序注释所保留,例如:
//go:generate go run gen.go
复制代码
参看 https://golang.org/cmd/compile/#hdr-Compiler_Directives.
集合、仓库和文件夹名字使用单数形式
github.com/golang/example/hello
github.com/golang/example/outyet
golang.org/x/mobile/example/basic
golang.org/x/mobile/example/flappy
golang.org/x/image/...
github.com/shurcooL/tictactoe/player/bad
github.com/shurcooL/tictactoe/player/random
复制代码
github.com/golang/examples/hello
github.com/golang/examples/outyet
golang.org/x/mobile/examples/basic
golang.org/x/mobile/examples/flappy
golang.org/x/images/...
github.com/shurcooL/tictactoe/players/bad
github.com/shurcooL/tictactoe/players/random
复制代码
避免无用的方法接受者名字
这样:
func (foo) method() {
...
}
复制代码
不要这样:
func (f foo) method() {
...
}
复制代码
判断空字符
互斥帽
struct {
...
rateMu sync.Mutex
rateLimits [categories]Rate
mostRecent rateLimitCategory
}
复制代码
这里,rateMu 是一个互斥帽,它的存在,就像一顶帽子,在它保护的变量上方。
所以,不需要写注释,上面的内容可以默认等价于如下:
struct {
...
// rateMu protects rateLimits and mostRecent.
rateMu sync.Mutex
rateLimits [categories]Rate
mostRecent rateLimitCategory
}
复制代码
当添加新的成员,不相干的字段不受 rateMu 保护,要这样:
struct {
...
rateMu sync.Mutex
rateLimits [categories]Rate
mostRecent rateLimitCategory
+
+ common service
}
复制代码
不要这样:
struct {
...
rateMu sync.Mutex
rateLimits [categories]Rate
mostRecent rateLimitCategory
+ common service
}
复制代码
参看 https://talks.golang.org/2014/readability.slide#21.
flag.Usage 里不要 os.Exit(2)
这样:
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
}
复制代码
不要这样:
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
os.Exit(2)
}
复制代码
os.Exit 不要调用,因为 flat 包会做退出。参看例子 https://github.com/mdempsky/unconvert/commit/3b9aa41c71a855a5f5fee96dc751979ce6e8cbbe 和 https://github.com/campoy/embedmd/pull/12
评论