Go语言规范汇总( 三 )


【规则3.10.4】公共包内禁止使用panic,如果有panic需要内部recover并返回error 。
其他【建议3.11.1】在代码中编写字符串形式的json时,使用反单引号,而不是双引号 。
【规则3.11.2】相对独立的程序块之间、变量说明之后必须加空行,而逻辑紧密相关的代码则放在一起 。
【规则3.11.3】尽早return:一旦有错误发生,马上返回 。
【建议3.11.4】禁止出现2处及以上的重复代码 。
【建议3.11.5】if条件判断, 同时使用超过3个表达式以上的时候, 使用switch替代 。
【建议3.11.6】定义bool变量时,要避免判断时出现双重否定,应使用肯定形式的表达式 。
【建议3.11.7】for循环初始值从0开始,判断条件使用<无等号的方式 。
【建议3.11.8】长句子打印或者调用,使用参数进行格式化分行
【建议3.11.9】 将 for-select 封装到函数中
【建议3.11.10】把 slice、map 等定义为自定义类型
【建议3.11.11】 为访问 map 增加 setter,getters
参数传递【建议3.11.12】 对于少量数据,不要传递指针
【建议3.11.13】 对于大量数据的 struct 可以考虑使用指针
【建议3.11.14】 传入的参数是 map,slice,chan 不要传递指针,因为 map,slice,chan 是引用类型,不需要传递指针的指针
注意闭包的调用【原则3.11.15】在循环中调用函数或者goroutine方法,一定要采用显示的变量调用,不要再闭包函数里面调用循环的参数
优化篇

本篇的意义是为开发提供一些经过验证的开发规则和建议,让开发在开发过程中避免低级错误,从而提高代码的质量保证和性能效率
质量保证代码质量保证优先原则【原则4.1.1】代码质量保证优先原则:
(1)正确性,指程序要实现设计要求的功能 。
(2)简洁性,指程序易于理解并且易于实现 。
(3)可维护性,指程序被修改的能力,包括纠错、改进、新需求或功能规格变化的适应能力 。
(4)可靠性,指程序在给定时间间隔和环境条件下,按设计要求成功运行程序的概率 。
(5)代码可测试性,指软件发现故障并隔离、定位故障的能力,以及在一定的时间和成本前提下,进行测试设计、测试执行的能力 。
(6)代码性能高效,指是尽可能少地占用系统资源,包括内存和执行时间 。
(7)可移植性,指为了在原来设计的特定环境之外运行,对系统进行修改的能力 。
对外接口原则【原则4.1.2】对于主要功能模块抽象模块接口,通过interface提供对外功能 。
值与指针(T/*T)的使用原则【建议4.1.3.1】基本类型传递时,尽量使用值传递 。
【建议4.1.3.2】如果传递字符串或者接口对象时,建议直接实例传递而不是指针传递 。
【建议4.1.3.3】如果是map、func、chan,那么直接用T 。
【建议4.1.3.4】如果是slice,method里面不重新reslice之类的就用T 。
【建议4.1.3.5】如果想通过method改变里面的属性,那么请使用*T 。
【建议4.1.3.6】如果是struct,并且里面包含了sync.Mutex之类的同步原语,那么请使用*T,避免copy 。
【建议4.1.3.7】如果是一个大型的struct或者array,那么使用*T会比较轻量,效率更高 。
【建议4.1.3.8】如果是struct、slice、array里面的元素是一个指针类型,然后调用函数又会改变这个数据,那么对于读者来说采用*T比较容易懂 。
【建议4.1.3.9】其它情况下,建议采用*T 。
init的使用原则【规则4.1.4.1】一个文件只定义一个init函数 。
【规则4.1.4.2】一个包内的如果存在多个init函数,不能有任何的依赖关系 。
defer的使用原则【建议4.1.5.1】如果函数存在多个返回的地方,则采用defer来完成如关闭资源、解锁等清理操作 。
【建议4.1.5.2】defer会消耗更多的系统资源,不建议用于频繁调用的方法中 。
【建议4.1.5.3】避免在for循环中使用defer 。
Goroutine使用原则【规则4.1.6.1】确保每个goroutine都能退出 。
【规则4.1.6.2】禁止在闭包中直接引用闭包外部的循环变量 。
Channel使用原则【规则4.1.7.1】传递channel类型的参数时应该区分其职责 。
【规则4.1.7.2】确保对channel是否关闭做检查 。
【规则4.1.7.3】禁止重复释放channel 。
其它【建议4.1.8.1】使用go vet --shadow检查变量覆盖,以避免无意的变量覆盖 。
【建议4.1.8.2】GO的结构体中控制使用Slice和Map 。
【规则4.1.8.3】避免在循环引用调用 runtime.SetFinalizer 。
【规则4.1.8.4】避免在for循环中使用time.Tick()函数 。


推荐阅读