Golang 代码质量检查工具 | golangci-lint

背景

开发团队代码,保持一个统一的风格和规范,有利于团队协作和交流。

对代码进行质量检查,能达到以下作用:

  1. 提高代码质量:代码质量检查可以帮助团队发现潜在的错误和问题,从而提高代码的稳定性和可靠性。

  2. 统一编码规范:通过代码质量检查,可以确保团队成员遵循统一的编码规范,提高代码的可读性和可维护性。

  3. 减少技术债务:及时发现并修复代码中的问题,可以减少技术债务的积累,降低未来的维护成本。

  4. 提高开发效率:通过自动化的代码检查,可以减少人工审查的时间,让开发人员专注于更重要的任务。

  5. 促进团队协作:代码质量检查可以作为团队协作的一部分,帮助新成员快速了解项目规范,促进团队成员之间的协作。

所以,需要借助一个工具对团队代码进行统一标准的质量检查。

认识 golangci-lint

golangci-lint 是一个针对 Go 语言的代码质量检查工具,它集成了多个 linter(代码检查工具)和静态分析工具,可以帮助团队检查代码中的各种问题。

以下是 golangci-lint 的一些主要特性和作用:

  1. 多工具集成:集成了多个 Go 语言的 linter 和静态分析工具,如 gofmtgo veterrcheck 等。

  2. 自定义配置:支持自定义配置文件,可以根据团队的需求配置不同的检查规则。

  3. 快速反馈:在代码提交之前进行快速检查,及时发现问题,减少代码合并时的冲突。

  4. 易于集成:可以轻松集成到现有的 CI/CD 流程中,自动化代码质量检查。

  5. 丰富的检查规则:提供了丰富的检查规则,包括但不限于死代码、错误处理、代码复杂度、性能问题等。

  6. 跨平台支持:支持多个操作系统,可以在不同的开发环境中使用。

利用 golangci-lint 期望达到的效果:

  1. 提高代码质量:通过自动化检查,及时发现并修复代码中的错误和潜在问题。

  2. 统一编码规范:确保团队成员遵循统一的编码规范,提高代码的一致性和可读性。

  3. 减少技术债务:通过定期检查,减少技术债务的积累,降低未来的维护成本。

  4. 提高开发效率:自动化的代码检查可以减少人工审查的时间,让开发人员有更多的时间专注于开发。

  5. 促进团队协作:代码质量检查可以作为团队协作的一部分,帮助新成员快速了解项目规范,促进团队成员之间的协作。

  6. 提高项目成功率:高质量的代码是成功项目的基石,通过代码质量检查,可以提高项目的成功率。

安装和使用

  1. 安装 golangci-lint

可以通过两种方式安装 golangci-lint

  • 使用 go install 命令:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

注意:注意要和当前 golang 环境的版本匹配。如果 Golang 版本过低,也要降低 golangci-lint 的版本,具体有哪些版本可以参考 https://github.com/golangci/golangci-lint/releases。比如安装版本 v1.46.1,安装命令变为:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.1

  • 使用官方提供的二进制文件进行安装,适用于不同平台:
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s latest

安装完成后,执行以下命令检查是否安装成功:

golangci-lint --version

执行以下命令,可以查看 golangci-lint 的帮助文档,了解不同版本支持的命令和选项:

golangci-lint help linters 

2. 基本使用

在项目的根目录中运行以下命令,golangci-lint 会自动检查当前目录及子目录下的 Go 代码:

golangci-lint run

这将自动运行一系列内置的 linter 来分析代码。如果有问题,它会输出错误和警告。常见的 lint 检查包括:

  • 代码风格(如变量命名)

  • 不必要的类型转换

  • 未使用的变量和导入包

  • 潜在的空指针访问

  • 性能优化建议

3. 常用选项

  • 只检查特定文件: 如果只想检查某个文件或目录,可以指定路径:
golangci-lint run ./path/to/yourfile.go
  • 检查并修复(自动修复部分问题): 可以尝试自动修复代码中的部分问题:
golangci-lint run --fix
  • 跳过特定的文件或目录: 使用 --skip-files 跳过某些文件的检查,例如测试文件或第三方代码:
golangci-lint run --skip-files usecase_test.go
  • 列出支持的所有 lintergolangci-lint 内置了多种 linter,使用以下命令可以列出所有可用的 linter:
golangci-lint linters
  • 指定要启用或禁用的 linter: 可以通过配置来启用或禁用特定的 linter。如下示例只启用 govetgolint,并禁用 errcheck
golangci-lint run --enable=govet --enable=golint --disable=errcheck

4. 配置文件

为了方便管理 lint 规则,可以在项目根目录创建 .golangci.yml 配置文件,进行更细粒度的控制。

以下是一个典型的配置示例:

linters:enable:     # 设置允许使用的 linter- govet- golint- staticcheckdisable:    # 禁止使用的 linter- errcheckrun:timeout: 2m  # 设置运行超时时间skip-dirs:- vendor  # 跳过 vendor 目录skip-files:- .*_test\.go  # 跳过测试文件issues:exclude-rules:- linters:- golinttext: "don't use underscores in Go names"  # 忽略 golint 的特定规则

5. CI/CD 集成

可以将 golangci-lint 集成到 CI/CD 流水线中,确保每次提交的代码都经过严格的 lint 检查。

以 GitLab CI 为例:

lint:stage: testscript:- golangci-lint runallow_failure: false  # 如果 lint 失败则阻止代码合并

Goland + golangci-lint

很多 IDE(如 VSCode、GoLand)都可以通过插件集成 golangci-lint,从而在开发过程中实时显示 lint 问题,极大地提高代码编写的质量和效率。

在 GoLand 中集成 golangci-lint 可以让你在开发过程中实时检查代码质量,并在编写代码时提示错误或警告。以下是如何在 GoLand 中集成 golangci-lint 的详细步骤:

1. 安装 golangci-lint

如果还没有安装 golangci-lint,请首先在终端中安装:

go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

或者通过其他方式安装(如使用二进制文件),确保能够从终端运行 golangci-lint

2. 配置 GoLand

步骤 1:打开 GoLand 的设置

在 GoLand 界面中,依次点击:File -> Settings -> Tools -> External Tools
在这里插入图片描述

步骤 2:添加一个新的 External Tool
  1. 点击右上角的 + 按钮,创建一个新的外部工具。

  2. 填写以下配置项:

  • Namegolangci-lint

  • Group:可以选择不填,或者自定义为 Go Tools

  • Program:填写 golangci-lint 的安装路径,通常为:

    • 如果通过 go install 安装,路径是 $GOPATH/bin/golangci-lint,在 Unix 系统上可能是 $HOME/go/bin/golangci-lint

    • 在 Windows 系统上可能是 C:\Users\<your-username>\go\bin\golangci-lint.exe

  • Arguments:填写 run,也可以根据需要添加更多参数,如 run --fix(自动修复部分问题)。

  • Working directory:填入 $ProjectFileDir$,确保命令在项目的根目录下运行。

  • 示例如下:

    • Program: $HOME/go/bin/golangci-lint (在 Linux/macOS 中)

    • Arguments: run

    • Working directory: $ProjectFileDir$

点击 OK 保存设置。
在这里插入图片描述

步骤 3:运行 golangci-lint
  1. 配置完成后,打开你想要检查的 Go 项目。

  2. 右键点击项目的根目录,选择:

External Tools -> golangci-lint
  1. GoLand 将会运行 golangci-lint,并在终端中输出检查结果。

3. 配置 golangci-lint检查结果高亮

要让 GoLand 直接在代码中显示 golangci-lint 的检查结果,可以借助 GoLand 的 File Watchers 插件,或者结合 GoLand 的 File Watcher 功能来自动运行。

步骤 1:安装 File Watchers 插件
  1. 打开 Settings -> Plugins

  2. 搜索 File Watchers,并点击 Install

  3. 安装完成后,重启 GoLand。

步骤 2:配置 File Watchers 运行 golangci-lint
  1. 打开 Settings -> Tools -> File Watchers

  2. 点击右上角的 + 按钮,选择 Custom,为 golangci-lint 配置一个新的文件监视器。

  3. 配置如下:

  • File Type:选择 Go

  • Scope:选择 Current FileWhole Project,根据你的需要配置范围。

  • Program:填写 golangci-lint 的路径。

  • Arguments:填写 run --out-format=colored-line-number --issues-exit-code=0 $FilePathRelativeToProjectRoot$

  • Output paths:可以为空。

步骤 3:保存并启用

保存配置后,File Watchers 将会在你修改 Go 文件时自动运行 golangci-lint,并在编辑器中高亮显示 lint 问题。
在这里插入图片描述
在这里插入图片描述

AI 分析测试结果

分析单个文件,一般规范问题不会过多,手动处理即可。

但如果在 CI/CD 流程中集成质量检查,一次性提交的代码可能规范性问题过多,人工读取信息,可能会有遗漏,且不熟悉 golangci-lint 的开发人员也不太会用。

所以,这种情况下,可以利用 AI 分析,如下提示词:

golang代码检查测试如下,请总结解释以及给出具体文件、代码行对应的修改建议:PS D:\develop\go\regionService> golangci-lint run
test\other\sync\main.go:48:6: `request` is unused (deadcode)
func request(host, uri string) {^
bll\model\0_response.go:251:6: `callers` is unused (deadcode)
func callers() string {^
bll\service\device.go:269:5: `deviceNameRegion` is unused (deadcode)
var deviceNameRegion = map[string]string{^
http\router.go:101:6: `runRouter` is unused (deadcode)
func runRouter(r *gin.Engine) {^
bll\service\cmd.go:152:24: Error return value is not checked (errcheck)go ActionAliDeviceCmd(v)^
……

AI 识别一一罗列检测出来代码的具体问题:

这些是使用 `golangci-lint` 工具在 Go 代码中检测到的一系列问题。下面是每个问题的总结和修改建议:1. **未使用的变量(deadcode)**:- `test\other\sync\main.go:48`、`bll\model\0_response.go:251`、`bll\service\device.go:269`、`http\router.go:101`:这些文件中定义了变量或函数,但它们没有在代码中被使用。建议检查这些变量或函数是否必要,如果不使用,应该删除它们。2. **错误返回值未检查(errcheck)**:- `bll\service\cmd.go:152`、`bll\service\cmd.go:186`、`bll\service\cmd_func.go:23`、`bll\service\device.go:67`、`bll\service\smart_2_control.go:172`、`bll\service\smart_2_control.go:572`、`bll\service\user.go:99`、`bll\service\user.go:136`、`test\bll\service\smart_test.go:9`:这些行中的函数调用返回了错误值,但没有进行检查。建议添加错误检查逻辑,例如 `if err != nil { return err }`。3. **多余的返回语句(gosimple)**:- `dao\redis\google_home_status.go:42`:在函数的末尾有多余的 `return` 语句。建议删除多余的 `return`。4. **简化的返回语句(gosimple)**:- `bll\validate\product_id.go:10`、`bll\validate\user.go:36`、`bll\validate\user.go:61`:这些地方的代码可以通过直接返回条件表达式的结果来简化。……这些修改建议可以帮助你清理代码,提高代码质量和可维护性。

如上的输出,什么问题,哪个文件,哪一行,都有标注。
把错误信息输出,开发人员看到 CI 流程失败后,直接就可以看到具体指向性的错误信息,能极大提高团队整体规范性的建设过程,也能让程序开发人员快速培养代码规范能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代&#xff0c;如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具&#xff0c;凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性&#xff0c;成为了众多企业和个人的首选。本文将…

Anthropic分享RAG最佳实践:Contextual Retrieval

先说结论&#xff0c;Anthropic提出了一种显著改进RAG中检索步骤的方法。这种方法被称为“上下文检索&#xff08;Contextual Retrieval&#xff09;”&#xff1a; 它使用两种子技术&#xff1a;上下文嵌入&#xff08;Contextual Embeddings&#xff09;和上下文BM25这种方法…

pdf删除几个页面怎么操作?PDF页面删除的快捷方法

pdf删除几个页面怎么操作&#xff1f;在日常办公与学习中&#xff0c;PDF文件因其跨平台兼容性和良好的格式保持性而广受欢迎。然而&#xff0c;随着文件内容的累积&#xff0c;PDF文档往往会变得庞大而臃肿&#xff0c;不仅占用存储空间&#xff0c;还可能在传输时造成不便。因…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

FAST-LIVO复现

文章目录 FAST-LIVO准备工作编译运行复现效果 FAST-LIVO FAST-LIVO&#xff08;Fast LiDAR-Inertial-Visual Odometry&#xff09;是一种融合LiDAR&#xff08;激光雷达&#xff09;、惯性测量单元&#xff08;IMU&#xff09;和视觉信息的里程计算法。它旨在提供高精度和实时…

MySQL 执行流程是怎样的?

可以看到&#xff0c; MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现。存储引擎层负责数据的存储和读取。 InnoDB、MyISAM、Memory。不同的存储引擎共用一个 Server 层…

7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您提供了丰富的运算资源。如下图所示&#xff1a; 二、设计参考标准 ● PCIMG 2.0 R3.0 CompactP…

推荐一个可以免费上传PDF产品图册的网站

​在数字化时代&#xff0c;企业将产品图册以PDF格式上传至网络&#xff0c;不仅便于客户浏览和下载&#xff0c;还能提升企业的专业形象。今天&#xff0c;就为您推荐一个可以免费上传PDF产品图册的网站——FLBOOK&#xff0c;轻松实现产品图册的在线展示。 1.注册登录&#x…

从Naive RAG到Agentic RAG:基于Milvus构建Agentic RAG

检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;作为应用大模型落地的方案之一&#xff0c;通过让 LLM 获取上下文最新数据来解决 LLM 的局限性。典型的应用案例是基于公司特定的文档和知识库开发的聊天机器人&#xff0c;为公司内部人员快速检索内部…

服务器数据恢复—Raid5阵列硬盘磁头损坏导致掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌存储设备上有一组由10块硬盘&#xff08;9块数据盘1块热备盘&#xff09;组建的raid5阵列&#xff0c;上层部署vmware exsi虚拟化平台。 服务器故障&#xff1a; raid5阵列中两块硬盘对应的指示灯亮黄灯掉线。硬盘序列号无法读取&am…

在Centos中安装、配置与使用atop监控工具

目录 前言1. atop工具的安装1.1 atop简介1.2 atop的安装步骤 2. 安装并配置netatop模块2.1 安装内核开发包2.2 安装所需依赖2.3 下载netatop2.4 解压并安装netatop2.5 启动netatop 3. atop的配置与使用3.1 配置监控周期与日志保留时间3.2 设置定时任务生成日志3.3 启动与查看at…

ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF(Unified Robot Description Format)语法详解

URDF 文件是一个标准的 XML 文件格式&#xff0c;用于在 ROS 中描述机器人模型的结构。URDF 通过预定义的一系列标签&#xff0c;简洁地表达机器人的组成和运动关系。虽然机器人模型可能非常复杂&#xff0c;但在 URDF 中可以主要简化为两个核心部分&#xff1a; 连杆&#xff…

Linux——echo-tail-重定向符

echo命令 类似printf 输出&#xff0c;最好加“ ” echo "hello Linux" 反引号 ‘ ’ 引用命令 echo ‘ pwd ’ 重定向符 > 和 >> > 覆盖 >> 追加 tail命令 查看文件尾部内容&#xff0c;追踪文件最新更改 tail -num 从尾部往上读num行&#…

九大排序之选择排序和归并排序

1.前言 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 本章重点&#xff1a; 堆排序和选择排序和归并排序 2.选择排序 基本思路 left和right记录区间的左端和右…

Centos7 搭建单机elasticsearch

以下是在 CentOS 7 上安装 Elasticsearch 7.17.7 的完整步骤&#xff1a;&#xff08;数据默认保存在/var/lib/elasticsearch下&#xff0c;自行更改&#xff09; 一、装 Java 环境 Elasticsearch 是用 Java 编写的&#xff0c;所以需要先安装 Java 运行环境。 检查系统中是…

pdf怎么删除多余不想要的页面?删除pdf多余页面的多个方法

pdf怎么删除多余不想要的页面&#xff1f;在日常办公或学习中&#xff0c;我们经常会遇到需要处理PDF文件的情况。PDF文件因其格式稳定、不易被篡改的特点而广受青睐&#xff0c;但在编辑方面却相对不如Word等文档灵活。有时&#xff0c;在接收或创建的PDF文件中&#xff0c;可…

OceanBase 的写盘与传统数据库有什么不同?

背景 在数据库开发过程中&#xff0c;“写盘”是一项核心操作&#xff0c;即将内存中暂存的数据安全地转储到磁盘上。在诸如MySQL这样的传统数据库管理系统中&#xff0c;写盘主要有以下几步&#xff1a;首先将数据写入缓存池&#xff1b;其次&#xff0c;为了确保数据的完整性…

利用Spring Boot构建大创项目资源规划平台

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

Linux的zookeeper安装部署

1.zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和HBASE的重要组件 2.下载zookeeper安装包zookeeper安装包https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/ 移动到Linux解压 解压到/export/server文件夹 命令: tar -xvf apache-zooke…

【前端】如何制作一个自己的网页(6)

接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键&#xff0c;选择【复制图片地址】&#xff0c;即可获得该图片的网络地址。 其实在HTML中&#xff0c;除了图片以外&#xff0c;我们还可以利用地址找到另一个网页。 如右图所示&#…