Golang编码规范之规范01
Golang编码规范之规范01¶
一 避免过长的行¶
避免使用需要读者水平滚动或过度转动头部的代码行。
我们建议将行长度限制为 99 characters (99 个字符). 作者应该在达到这个限制之前换行, 但这不是硬性限制。 允许代码超过此限制。
二 一致性¶
本文中概述的一些标准都是客观性的评估,是根据场景、上下文、或者主观性的判断;
但是最重要的是,保持一致.
一致性的代码更容易维护、是更合理的、需要更少的学习成本、并且随着新的约定出现或者出现错误后更容易迁移、更新、修复 bug
相反,在一个代码库中包含多个完全不同或冲突的代码风格会导致维护成本开销、不确定性和认知偏差。所有这些都会直接导致速度降低、代码审查痛苦、而且增加 bug 数量。
将这些标准应用于代码库时,建议在 package(或更大)级别进行更改,子包级别的应用程序通过将多个样式引入到同一代码中,违反了上述关注点。
三 相似的声明放在一组¶
Go 语言支持将相似的声明放在一个组内。
- Bad
- Good
这同样适用于常量、变量和类型声明:
- Bad
- Good
仅将相关的声明放在一组。不要将不相关的声明放在一组。
- Bad
- Good
分组使用的位置没有限制,例如:你可以在函数内部使用它们:
- Bad
func f() string {
red := color.New(0xff0000)
green := color.New(0x00ff00)
blue := color.New(0x0000ff)
...
}
- Good
func f() string {
var (
red = color.New(0xff0000)
green = color.New(0x00ff00)
blue = color.New(0x0000ff)
)
...
}
例外:如果变量声明与其他变量相邻,则应将变量声明(尤其是函数内部的声明)分组在一起。对一起声明的变量执行此操作,即使它们不相关。
- Bad
func (c *client) request() {
caller := c.name
format := "json"
timeout := 5*time.Second
var err error
// ...
}
- Good
func (c *client) request() {
var (
caller = c.name
format = "json"
timeout = 5*time.Second
err error
)
// ...
}
四 import 分组¶
导入应该分为两组:
- 标准库
- 其他库
默认情况下,这是 goimports 应用的分组。
- Bad
- Good
五 包名¶
当命名包时,请按下面规则选择一个名称:
- 全部小写。没有大写或下划线。
- 大多数使用命名导入的情况下,不需要重命名。
- 简短而简洁。请记住,在每个使用的地方都完整标识了该名称。
- 不用复数。例如
net/url
,而不是net/urls
。 - 不要用“common”,“util”,“shared”或“lib”。这些是不好的,信息量不足的名称。
六 函数名¶
我们遵循 Go 社区关于使用 MixedCaps 作为函数名 的约定。有一个例外,为了对相关的测试用例进行分组,函数名可能包含下划线,如:TestMyFunction_WhatIsBeingTested
.