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"
)

参考文献

github.com/uber-go/guide

以上是关于Go 编码规范建议——风格篇的主要内容,如果未能解决你的问题,请参考以下文章

Go 编码规范建议

Go 编码规范建议

GO 编码规范

前端编码规范 -- 通用篇

编码规范之代码风格

golang编码规范