Go 编码规范建议——风格篇
Posted 恋喵大鲤鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 编码规范建议——风格篇相关的知识,希望对你有一定的参考价值。
1.格式化
代码必须用 gofmt 格式化。
2.代码行
行长度
一行代码不要超过120列,超过的情况,使用合理的换行方法换行。
例外场景:
- import 模块语句
- struct tag
- 工具生成代码
换行方式
采用惰性换行,换行前应尽可能的占满不留空位。
// Bad
fmt.Printf("%v %v %v %v %v %v %v %v %v %v %v %v %v %v\\n",
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, 233)
// Good
fmt.Printf("%v %v %v %v %v %v %v %v %v %v %v %v %v %v\\n", 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
89, 144, 233)
不必要的空行
- 函数体第一行不要换行。
// Bad
func foo() {
// func body
}
// Good
func foo() {
// func body
}
- 函数调用和对调用结果的处理,是紧密相连的,不能加空行
// Bad
res, err := foo()
if err != nil || res.Ret != 0 {
return
}
// Good
res, err := foo()
if err != nil || res.Ret != 0 {
return
}
- return 语句前不要换行
// Bad
func foo() {
// func body
return
}
// Good
func foo() {
// func body
return
}
3.括号和空格
- 遵循 gofmt 的逻辑。
- 运算符和操作数之间要留空格。
- 作为输入参数或者数组下标时,运算符和运算数之间不需要空格,紧凑展示。
var f float64 = 0.2 + 0.8 // 运算符和操作数之间要留空格
fmt.Printf("%f\\n", f+1) // a+1 作为入参不要留空格
- 不必要的括号
// Bad
if foo && (int(bar) > 0) {
// ...
}
// Good
if foo && int(bar) > 0 {
// ...
}
4.字符串
使用反引号表示原始字符串字面值,避免转义
// Bad
wantError := "unknown name:\\"test\\""
// Good
wantError := `unknown error:"test"`
5.import 规范
- 使用 goimports 自动格式化引入的包名,import 规范原则上以 goimports 规则为准
- goimports 会自动把依赖包按首字母排序,并对包进行分组管理,通过空行隔开,默认分为本地包(标准库、内部包)和外部包
- 包采用四段式组织,从上到下分别是标准库,外部包,匿名包和内部包
- 带域名的包名都属于外部包,如
github.com/xxx/xxx
- 匿名包的引用建议使用一个新的分组引入,并在匿名包上写上注释说明
- 内部包是指不能被外部 import 的包
import (
// standard package
"encoding/json"
"strings"
// third-party package
"git.obc.im/obc/utils"
"git.obc.im/dep/beego"
"git.obc.im/dep/mysql"
elastic "github.com/olivere/elastic/v7"
// anonymous package
// import filesystem storage driver
_ "git.code.oa.com/org/repo/pkg/storage/filesystem
// inner package
"myproject/models"
"myproject/controller"
)
- 不要使用相对路径引入包,应该使用完整的路径引入包:
// 不要采用这种方式
import (
"../net"
)
// 应该采用完整路径引入包
import (
"xxxx.com/proj/net"
)
- 包名和 git 路径名不一致时,或者多个相同包名冲突时,使用别名代替:
import (
elastic "github.com/olivere/elastic/v7"
)
参考文献
以上是关于Go 编码规范建议——风格篇的主要内容,如果未能解决你的问题,请参考以下文章