这一篇主要介绍Go代码规范,帮助我们编写符合 go 习惯的 格式上比较优雅的代码。使用goimport 分组这样import 可以分组,显得比较整洁。
import ( "fmt" "os" "go.uber.org/atomic" "golang.org/x/sync/errgroup")
相同的类型放到一组const ( a = 1 b = 2)var ( a = 1 b = 2)type ( Area float64 Volume float64)
包名当命名包时,请按下面规则选择一个名称:全部小写。
没有大写或下划线。大多数使用命名导入的情况下,不需要重命名。简短而简洁。
请记住,在每个使用的地方都完整标识了该名称。
这些是不好的,信息量不足的名称。不要使用别名只有在包名冲突的情况下才需要使用别名,不要滥用别名import ( "fmt" "os" "runtime/trace" nettrace "golang.net/x/trace")
减少嵌套这个应该是各种语言都要遵守的规范,避免出现多层if else 嵌套应该将下面的代码for _, v := range data { if v.F1 == 1 {v = process(v)if err := v.Call(); err == nil { v.Send()} else { return err} } else {log.Printf("Invalid v: %v", v) }}
改造成下面的方式for _, v := range data { if v.F1 != 1 {log.Printf("Invalid v: %v", v)continue } v = process(v) if err := v.Call(); err != nil {return err } v.Send()}
减少没有必要的else应该将下面的代码var a intif b { a = 100} else { a = 10}
改造成a := 10if b { a = 100}
使用字段名初始化结构体不要为了省事k := User{"John", "Doe", true}
而应该写全了。k := User{FirstName: "John",LastName: "Doe",Admin: true,}
空slice检查空的slice 不应该使用func isEmpty(s []string) bool { return s == nil}
而应该通过len 方法。
func isEmpty(s []string) bool { return len(s) == 0}
9、缩小变量作用域如下写法 err 返回是整个函数err := ioutil.WriteFile(name, data, 0644)if err != nil { return err}
改成如下写法就可以控制在 if 函数之内。