Go语言编写规范
-
声明空的slice应使用下面的格式
var t []string /* 原因: var t []string 声明了一个nil slice t := []string{} 声明的是一个长度为0的非nil slice */
-
打印输出
//错误字符串不应该大写,应该写成: fmt.Errorf("failed to write data") //而不是写成 fmt.Errorf("Failed to write data")
-
缩写词,必须保持一致,比如都大写URL或者小写url。比如HTTP、ID等
-
常量命名,一般使用驼峰命名方式区分包含多个单词的名称
const MaxLength
-
error处理,不使用_忽略错误。尽量不要使用panic
-
包名使用单数的形式,比如util、model,而不是utils、models
-
Receiver的名称应该缩写, 如果方法中没有使用receiver,可以省略receiver name
func (f foo) method() { ... } func (foo) method() { ... }
-
自定义的Error放在package级别中,统一进行维护,并且变量以Err开头
-
空字符串检查
//正确写法 if s == "" { ... } //其他不规范写法 if len(s) == 0 { ... } if s == nil || s == "" { ... }
-
非空slice检查
//正确写法,直接比较长度即可 if len(s) > 0 { ... } //不规范写法 if s != nil && len(s) > 0 { ... }
-
省略不必要的变量,例如error。通常第三方的类会提供带error和不带error的相同方法,如非必需,可选不带error的方法进行调用
-
直接使用bool值,不需要将它和true/false进行比较
if b { ... } if !b { ... }
-
byte/string slice相等性比较
var s1 []byte var s2 []byte ... bytes.Equal(s1, s2) == 0 bytes.Equal(s1, s2) != 0 /* 不要使用 bytes.Compare(s1, s2) == 0 bytes.Compare(s1, s2) != 0 */
-
append slice
//精简写法 var a, b []int b = append(b, a...) //冗余写法 var a, b []int for _, v := range a { b = append(b, v) }
-
简化range
var m map[string]int for _ = range m { ... } for _, _ = range m { ... } //可以简化为 for range m { ... }