Go官方编码规范
命名
- 对于文件名,应一律小写,不同单词之间用下划线分隔
- 对于变量,采用驼峰命名法。专有名词大小写要一致,例:可以 URL 或 url ,而不要 Url 。变量名应该尽可能短,尤其是局部变量。对于一些特殊的变量以及全局变量,可能需要对它有更多的描述,可以使用长命名
- 对于interface,名字应以er结尾,优先使用标准库中已经存在的接口
- 对于结构体,注意字段的导出性,首字母大写的字段可导出
Getter: obj.Xxx()
Setter: obj.SetXxx(xxx type) - 对于接收者,不应该采用 me、this、self等通用的名字,而应该采用简短的(1或2个字符)并且能反映出结构体名字的命名,而且同一结构体的接收者名字要保持一致
- 对于url,应仅包含小写字母,例:/name/get,而不要 /getName
- 对于post请求中的表单的key,采用下划线命名法
- 对于json数据,key采用下划线命名法,值的类型根据实际情况选择,而不要一律字符串
变量声明
stu := Student{
Name: "AcTarjan"
}
stu := Student{}
stu.Name = "AcTarjan"
var arr []string
arr := []string{}
接收者类型
- 接收者:方法的调用者
- 万能的建议:如果你不知道要使用哪种传递时,请选择指针传递吧!
- 建议使用指针传递的情况:
当函数内部需要修改接受者,必须使用指针传递。
当接受者是一个结构体,并且包含了sync.Mutex或者类似的用于同步的成员。避免成员拷贝。
当接受者类型是一个庞大的结构体或者是一个大数组,以此提高性能。
当接受者是结构体,数组或slice,并且其中的元素是指针,并且函数内部可能修改这些元素,这能使得函数的语义更加明确。 - 建议使用值传递的情况:
当接受者是map, chan, func,因为它们本身就是引用类型。
当接受者是slice,而函数内部不会对slice进行切片或者重新分配空间。
当接受者是小型结构体,小数组,并且不需要修改里面的元素,里面的元素又是一些基础类型
参数传递
- 一般情况下,传递值而不是指针
不要为了节省一点空间就传递指针而不是传递值。除非要传递的是一个庞大的结构体或者可预知在将来会变得非常庞大的结构体,指针是一个不错的选择。 - 需要对参数进行修改并且调用者需要使用这些修改时,传递指针
指针相关
var arr []string
err := json.Unmarshal(bs,&arr)
var arr *[]string
err := json.Unmarshal(bs,arr)
错误信息
日志打印
- 只打印关键结点的INFO级日志
- 只在调用者处理error的时候的打印日志