Revive是一个快速、可配置、可扩展、灵活的Go语言Linter,可以用来取代Golint。它提供了一个用于自定义规则的框架,能够定义一组预设的规则集合,以改善开发和代码审查过程。
Revive和golint的区别:
- 允许使用配置文件启用或禁用规则。
- 允许使用TOML文件配置检测规则。
- 运行与golint相同的规则快2倍。
- 可续的类型检查。大多数golint规则不需要类型检查。如果你在配置文件中禁用它们,revive将比golint快6倍。
- 提供多个格式化程序,使我们可以自定义输出。
- 允许为整个检测器或仅基于某些规则的失败自定义返回代码。
- 每个人都可以使用自定义规则或格式化程序轻松地扩展它。
- Revive提供了比golint更多的规则。
Revive推荐配置有24条规则,全部规则有70条。在使用初期可以使用推荐配置,避免过多的警告造成无从下手改进。随着推荐规则跑得很顺的情况下,可以尝试更多的规则组合来改进代码规范和发现潜在缺陷。
使用gui配置工具
使用gui配置工具,可以让配置revive规则更简单。
在凌鲨(linksaas)的微应用里面可以找到revive配置工具,快速对revive进行配置。
凌鲨(linksaas)是以开源方式运作的,您可以从linksaas · 极狐GitLab 访问源代码。也可以从 凌鲨 软件研发团队信息枢纽 下载预编译的版本。
附录
推荐规则
- 空引用检查(blank-imports)
- context参数检查(context-as-argument)
- context键检查(context-keys-type)
- 使用.导入包检查(dot-imports)
- 空块检查(empty-block)
- 错误命名检查(error-naming)
- 错误返回检查(error-return)
- 错误字符串检查(error-strings)
- errof调用检查(errorf)
- 导出函数检查(exported)
- if返回检查(if-return)
- 自增自减格式检查(increment-decrement)
- 流程精简检查(indent-error-flow)
- 包注释检查(package-comments)
- 简化range检查(range)
- 方法接收者命名检查(receiver-naming)
- 内置名称重定义检查(redefines-builtin-id)
- 消除else块检查(superfluous-else)
- 时间命名检查(time-naming)
- 变量命名检查(var-naming)
- 变量申明简化检查(var-declaration)
- 未导出返回类型检查(unexported-return)
- 不可到达代码检查(unreachable-code)
- 未使用参数检查(unused-parameter)
全部规则
- 增加常量定义(add-constant)
- 参数数量限制(argument-limit)
- sync/atomic检查(atomic)
- 直接返回检查(bare-return)
- 禁用字符检查(banned-characters)
- 空引用检查(blank-imports)
- 逻辑表达式布尔变量检查(bool-literal-in-expr)
- 显式垃圾收集调用检查(call-to-gc)
- 认知复杂度检查(cognitive-complexity)
- 注释空格检查(comment-spacings)
- 易误解的命名(confusing-naming)
- 易误解返回参数检查(confusing-results)
- 表达式结果恒定检查(constant-logical-expr)
- context参数检查(context-as-argument)
- context键检查(context-keys-type)
- 圈复杂度检查(cyclomatic)
- 数据竞争检查(datarace)
- 退出函数检查(deep-exit)
- defer常见错误检查(defer)
- 使用.导入包检查(dot-imports)
- 重复导入包检查(duplicated-imports)
- 提前返回检查(early-return)
- 空块检查(empty-block)
- 空白行检查(empty-lines)
- 错误命名检查(error-naming)
- 错误返回检查(error-return)
- 错误字符串检查(error-strings)
- errof调用检查(errorf)
- 导出函数检查(exported)
- 文件头检查(file-header)
- 标记参数检查(flag-parameter)
- 函数返回数量检查(function-result-limit)
- 函数长度检查(function-length)
- get前缀函数检查(get-return)
- 相同分支检查(identical-branches)
- if返回检查(if-return)
- 自增自减格式检查(increment-decrement)
- 流程精简检查(indent-error-flow)
- 黑名单包检查(imports-blacklist)
- 导入隐藏检查(import-shadowing)
- 代码行长度检查(line-length-limit)
- 公共结构数量检查(max-public-structs)
- 参数修改检查(modifies-parameter)
- 修改值接收者检查(modifies-value-receiver)
- 内联结构检查(nested-structs)
- 优化计算顺序检查(optimize-operands-order)
- 包注释检查(package-comments)
- 简化range检查(range)
- 闭包中使用range检查(range-val-in-closure)
- 通过地址range检查(range-val-address)
- 方法接收者命名检查(receiver-naming)
- 内置名称重定义检查(redefines-builtin-id)
- 字符串格式检查(string-format)
- 结构标签检查(struct-tag)
- 消除else块检查(superfluous-else)
- 时间相等检查(time-equal)
- 时间命名检查(time-naming)
- 变量命名检查(var-naming)
- 变量申明简化检查(var-declaration)
- 无条件递归检查(unconditional-recursion)
- 未导出命名检查(unexported-naming)
- 未导出返回类型检查(unexported-return)
- 未处理错误检查(unhandled-error)
- 多余语句检查(unnecessary-stmt)
- 不可到达代码检查(unreachable-code)
- 未使用参数检查(unused-parameter)
- 未使用接收器检查(unused-receiver)
- any使用提示检查(use-any)
- 多余break检查(useless-break)
- WaitGroup传值检查(waitgroup-by-value)