命名风格
_name__name$namename_name$name__WriterWriteReaderIoerReqResxxxModel-package namepackagemain__testpackage db_utilspackage db_utils_test
常量定义
- 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
反例:
key := “Id#taobao_” + tradeId
cache.put(key, value)
// 缓存 get 时,由于在代码复制时,漏掉下划线,导致缓存击穿而出现问题 - 【推荐】不要使用一个常量集维护所有常量,要按常量功能进行归类,分开维护并做好归类的注释。
- 【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
1) 跨应用共享常量:放置在二方库 constant 目录下
2) 应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。
3) 子工程内部共享常量:即在当前子工程的 constant 目录下。
4) 包内共享常量:即在当前包下单独的 constant 文件中。
5) 文件内共享常量:直接在文件内部 const 定义。 - 【推荐】如果变量值仅在一个固定范围内变化用 const 类型来常量化。
正例: const Ok = 1 / const No = 0
代码格式
空格空格ifforswitch
代码工具
有助于改善 Go 代码的工具概述
https://github.com/golang/go/wiki/CodeTools/_edit
数组处理
sliceslice
字典处理
- 【推荐】使用 map 实现集合的功能。
- 【强制】通过下标的方式访问 map 中的元素总是会有值,如果健不在 map 中,会得到返回值的零值,有些情况下理应判断键是否在 map 中。
正例:age, ok := ages[“bob”]
结构体处理
- 【强制】禁止使用结构体匿名变量
并发处理
lamdba 架构应避免使用线程以及协程
- 【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。
说明:资源驱动类、工具类、单例工厂类都需要注意。 - 【强制】创建线程或线程池以及协程或者协程池时请指定有意义的线协程名称,方便出错时回溯。
- 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程(协程操作待定)。
说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
控制语句
switchcasebreakfallthroughswitch
注释规约
packagename
杂项
- 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
正例:
// 预编译当前正则表达式
re, _ := regexp.Compile("^hel+o")
// 是否匹配指定字符串
isMatch := re.MatchString(“hello world”) - 【推荐】不要在视图模板中加入任何复杂的逻辑。
说明:根据 MVC 理论,视图的职责是展示,不要抢模型和控制器的活。 - 【推荐】任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。
- 【推荐】及时清理不再使用的代码段或配置信息。
说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。
正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。
nilErrorErrerrfmt.Errorfswitchelse