Go代码风格

一、go代码风格

  一)命名风格

1、【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束

  错误范例:

_name / __name / $name / name_ / name$ / name__ 
2、【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式

  说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。

  注意,纯拼音命名方式更要避免采用

3、【强制】公用的变量、类型、接口、结构、函数以及结构体的成员变量等命名使用UpperCamelCase风格。
4、【强制】私有的变量、类型、接口、结构、函数以及参数名、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式

  正确范例

localValue / getHttpMessage() / inputUserId
5、 【强制】常量命名命名使用 UpperCamelCase 风格,并使用 const 声明,力求语义表达完整 清楚,不要嫌名长。

  正确范例

const StatusOK = 200
6、抽象结构命名使用 Abstract 或 Base 开头; 异常类命名使用 Err 结尾; 测试类命名以 Test 开头,以它要测试的函数的 名称结尾。

  正确范例

ParamsErr := errors.New(“params err”)
7、接口命名规范一般使用 er 结尾
  • 单个函数的接口名以“er”作为后缀,接口的实现则去掉 er;
  • 两个函数的接口名综合两个函数名,以 er 作为 后缀,接口的实现则去掉 er ;
  • 三个以上函数的接口,抽象这个接口的功能,类似于结构体命名
8、【强制】数据和切片类型命名以 Arr 结尾,map 类型以 Map 结尾。相同功用的结构体可以根据功能采 用相同的结尾, Api 请求以 Req 结尾, 相应以 Res 结尾,数据结构体以 xxxModel 结尾, xxx 即为数据表名。

   正确范例

var userArr [3]string / type LoginReq struct{} / type UserDO struct{}
9、【强制】返回结果主要为布尔类型的函数,函数名可以 is、has 等开头
10、【强制】名字命名规范
  • 工程名统一使用小写,单词之间使 用 - 分割。

  • 包目录名一律使用小写,尽量采用一 个单词命名,单词间不用符号分割,统一使用单 数形式,但是结构体名如果有复数含义,结构体 名可以使用复数形式。

  • 包目录下的包名( package namepackage ),如非 main 函数,和包目录名保持一直且单词间用 _ 分隔,测试文件以 _test 结 尾。

  正确范例

 db-utils / package db_utils / package db_utils_test

  错误范例

services
11、为了达到代码自解释的目标,任何自定义编程元 素在命名时,使用尽量完整的单词组合来表达其意。

  反例:var a int 的随意命名方式。

12、在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。

  如规范【8】所示。

  正确范例

startTime / startDate

  错误范例

startedAt / startDt
13、如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。

  说明:将设计模式体现在名字中,有利于阅读者 快速理解架构设计理念。

  二)代码格式

1、注意缩进:【强制】采用 tab 字符缩进,宽度设置为 4 个 空格
2、成对编程: {}、()、""、''、[]
3、【强制】如果是大括号内为空,则简洁地写成{} 即可,大括号中间无需换行和空格;如果是非空 代码块则:

  1) 左大括号前不换行。

  2) 左大括号后换行。

  3) 右大括号前换行。

  4) 右大括号后还有 else 等代码则不换行;表 示终止的右大括号后必须换行。

4、【强制】左小括号和字符之间不出现空格;同样, 右小括号和字符之间也不出现空格;而左大括号 前需要空格。 

  反例:if (空格 a == b 空格)

5、【强制】if / for / switch 等保留字与括号之间都必须加空格。
6、【强制】任何二目、三目运算符的左右两边都需 要加一个空格。 

  说明:运算符包括赋值运算符= 、逻辑运算符&&、 加减乘除符号等。

7、【强制】采用 tab 字符缩进,宽度设置为 4 个 空格
8、【强制】单行字符数限制不超过 120 个,超出 需要换行,换行时遵循如下原则:
  • 第二行相对第一行缩进一个 tab,从第三行 开始,不再继续缩进。
  • 运算符与上文一起作为结尾。
  • 方法调用的点符号与上文一起作为结尾。
  • 方法调用中的多个参数需要换行时,在逗号 后进行。
  • 在括号前不要换行
9、【强制】函数参数在定义和传入时,多个参数逗 号后边必须加空格。
10、行长约定

  一行最长不超过80个字符,超过的请使用换行展示,尽量保持优雅

  三)控制语句

1、【强制】switch语句

  在一个 switch 块内,每个 case 无需声 明 break 来 终 止 , 如 果 想 顺 序 执 行 使 用 fallthrough ;在一个 switch 块内,都必须包含 一个 default 语句并且放在最后,即使它什么代 码也没有。

2、【强制】在高并发场景中,避免使用”等于”判 断作为中断或退出的条件。

  说明:如果并发控制没有处理好,容易产生等值 判断被“击穿”的情况,使用大于或小于的区间 判断条件来代替。

  反例:判断剩余奖品数量等于 0 时,终止发放 奖品,但因为并发处理错误导致奖品数量瞬间变成了负数, 这样的话,活动无法终止。

3、【推荐】表达异常的分支时,少用 if-else 方式, 这种方式可以改写成:
if condition { … return obj; } // 接着写 else 的业务逻辑代码;

  说明:如果非使用 if()…else if()…else…方式表 达逻辑,避免后续代码维护困难,

  【强制】请勿 超过 3 层。

  正例:超过 3 层的 if-else 的逻辑判断代码可 以使用卫语句、策略模式、状态模式等来实现, 其中卫语句即代码逻辑先考虑失败、异常、中断、 退出等直接返回的情况,以方法多个出口的方 式,解决代码中判断分支嵌套的问题,这是逆向 思维的体现。

4、【参考】下列情形,需要进行参数校验:
  • 调用频次低的方法。
  • 执行时间开销很大的方法。此情形中,参数 校验时间几乎可以忽略不计,但如果因为参数错 误导致中间执行回退,或者错误,那得不偿失。
  • 需要极高稳定性和可用性的方法。
  • 对 外 提 供 的 开 放 接 口 , 不 管 是 RPC/API/HTTP 接口。
  • 敏感权限入口。
5、【参考】下列情形,不需要进行参数校验:
  • 极有可能被循环调用的方法。但在方法说明 里必须注明外部参数检查要求。
  • 底层调用频度比较高的方法。毕竟是像纯净 水过滤的最后一道,参数错误不太可能到底层才 会暴露问题。一般 DAO 层与 Service 层都在 同一个应用中,部署在同一台服务器中,所以 DAO 的参数校验,可以省略。

  四)杂项

1、【强制】在使用正则表达式时,利用好其预编译 功能,可以有效加快正则匹配速度。

   正确范例:

// 预编译当前正则表达式re, _ := regexp.Compile("^hel+o") // 是否匹配指定字符串 isMatch := re.MatchString(“hello world”)
2、【推荐】及时清理不再使用的代码段或配置信息。 

  说明:对于垃圾代码或过时配置,坚决清理干净, 避免程序过度臃肿,代码冗余。 

  正确范例:对于暂时被注释掉,后续可能恢复使用的 代码片断,在注释代码上方,统一规定使用三个 斜杠(///)来说明注释掉代码的理由。

  五)异常日志

1、【强制】使用控制流机制应对错误,通过从函数 返回错误作为附加返回值来指示错误,如果函数 有多个返回值,习惯上将错误值作为最后一个结 果返回。如果错误只有一种情况,结果通常设置为布尔类型。nil 值表示没有错误。

  正确范例:

res, err := somepkgAction()
2、【强制】对于总是成功返回的函数,不必返回错误。
3、【强制】错误信息的首字母小写且避免换行
  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VScode中,可以使用插件或者配置文件来定义代码风格。一个常用的插件是yapf,它可以自动将代码转换成所定义的代码风格。你可以在VScode中安装yapf插件,并手动修改yapf的配置文件来定义你想要的代码风格。 另外,VScode还支持使用pylint来检查代码,并提供相应的错误和警告提示。如果遇到pylint报错的情况,你可以在VScode中安装pylint插件,并根据报错信息进行相应的修复。 总结起来,通过安装相应的插件和配置文件,你可以在VScode中定义并使用自己喜欢的代码风格。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [VScode go代码风格格式化设置](https://blog.csdn.net/a344288106/article/details/109513887)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vscode做python代码风格检查](https://blog.csdn.net/silent_missile/article/details/99970121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值