Go代码质量与效率的工具

【插件推荐】Go代码质量与效率的工具

为了养成良好的代码习惯以及保证代码质量,在使用golang进行项目开发时,我向大家推荐几款插件工具,提高工作效率以及代码质量。正所谓工欲善其事必先利其器。

安装Go开发环境可以参考:一文带你搞定golang开发环境

  • 空引用静态分析器---nilaway

  • 漏洞检测工具---govulncheck

  • 代码静态质量工具---vet & golint & sonarqube

     

图片 老朋友nil,不能忽视的空引用

在形形色色的编程语言中除了Rust语言,其他语言或多或少的会有空引用,这似乎是在Rust出现之前老生常谈的问题。在Rust中会有非常出色的设计来避免。

"panic: runtime error: invalid memory address or nil pointer dereference"

上述报错,我相信大家应该非常非常非常非常非常...熟悉图片。基本上伴随着我们一路成长。可以说绝大多数的线上问题是它引起的,从某种意义上来说判空对于一个程序员的基本功也是一个重大考验。

托尼·霍尔( Tony Hoare )是快速排序算法的创造者,也是图灵奖(计算机领域的诺贝尔奖)的获得者。他把它添加到了 Algol 语言中,因为它看起来很实用而且容易实现。但几十年后,他后悔了:

我称之为我的十亿美元错误……当时,我正在设计第一个全面的类型系统,用于面向对象语言中的引用功能。我的目标是确保所有对引用的使用都是绝对安全的,由编译器自动执行检查。但是我无法拒绝定义一个 Null 引用的诱惑,因为它实在太容易实现了。这导致了无数错误、漏洞和系统崩溃。在过去的四十年里,这些问题可能已经造成了十亿美元的损失。

那么我们强调了那么多空引用的重要程度,那么我们如何及早预防呢?下面有请我们的主演嘉宾闪亮登场:

nilaway

项目地址:https://github.com/uber-go/nilaway

nilaway是一个静态分析工具(也就是说不用run,通过代码扫描就可以分分析出空引用问题),旨在帮助开发人员通过在编译时而不是运行时捕获它们来避免生产中的空引用恐慌。nilaway类似于标准的空引用分析器,但是,它采用了更加复杂和强大的静态分析技术来跟踪包内和包之间的空引用,并报告错误,为用户提供空引用,以便于调试。

该项目是Uber团队提供,Uber提供了很多组件框架,感谢大佬!比如:zap,Jaeger等,有机会慢慢分享给大家。

# 安装
go install go.uber.org/nilaway/cmd/nilaway@latest
# 检查分析
nilaway ./...

执行效果如下:

图片

工具已经分析出相关代码的nil引用点,需要进行判空处理。我们加上判空,然后再运行检查命令,如下:

图片

综上所述,示例中我们可以很明确的发现nilaway的强大之处。

图片 无妄之灾,引用官方包以及第三方包漏洞

随机语言生态的蓬勃发展,或多或少会在项目中引入很多第三方包,或者各色官包。正所谓常在“河边走哪有不湿鞋”,在这些包使用中可能会出现BUG,但是你又不可能每分每秒真的取观察社区或者论坛去分析哪些包由BUG,哪些需要修补升级。至于这些BUG产生的危险,作为程序员应该不需要再强调。那么闲话少说,请我们的主角登场:

govulncheck

项目地址:https://github.com/golang/vuln

Go对漏洞管理的支持包括分析代码库和二进制文件的工具,以显示依赖项中的已知漏洞。该工具由Go安全团队管理的Go漏洞数据库提供支持。

注意,各位!这个项目是由golang安全团队提供并且持续迭代的项目。因此,可以放心食用,除非你觉得你的实力比如他们更强且有闲工夫去自己研究一套工具,那你还不如去他们论坛上提issue。

# 安装
go install golang.org/x/vuln/cmd/govulncheck@latest
# 执行检测
govulncheck ./...

执行结果如下:

图片

结果中指出了漏洞所在的第三方包,以及其修复版本,我们可以通过修改mod文件,来更新使用新的版本来修复问题。

当然也有官包的问题,如下图所示:

图片

对于第一种问题,只能通过更新go版本解决的,还是需要慎重,毕竟跨版本,需要慎之又慎。如果不是1.20.13升1.20.14修复迭代,建议直接忽略,毕竟我们还是要稳为主。

对于第二种问题,则跟引用第三方包一样,升级一般就可以搞定。

图片 提高代码质量,消灭常见问题

关于这一块问题我们就直接开门见山了,很多IDE,比如Goland已经集成很多代码检测工具,你写代码的时候就已经在分析了。我们这里直接从从规范程度逐层推荐对应工具:

图片

    1. vet

      我们直接运行:

图片

我们可以看到vet检测出了不能运行的代码,当然这里只是举个例子

    1. golint

之前图片上直接显示了波浪线告警,则是golint的代码扫描结果,提示代码需要优化,虽然也能直接运行。

ps:我的工作环境是:VSCode+Error Lens插件,所以错误直接显示再代码上。

    1. sonarqube

      最后我们推荐有条件(想要折腾)的同学使用Sonarqube,下文是之前的sonar介绍文章,有兴趣同学不妨了解一下。

Sonar,让你的代码更规范

 

最后,向大家推荐一下,编译前的执行测试命令,我这里用makefile文件撰写了一段,综合上述工具,大家可以参考下:

test:
  go test ./... -gcflags=all=-l -cover
  go vet ./... || true
  golangci-lint run ./... || true
  govulncheck ./... || true
  nilaway ./... || true

test2file:
  go test ./... -v -gcflags=all=-l -json > sn_report_test.json
  go test ./... -gcflags=all=-l -coverprofile=sn_report_covprofile
  go vet -json ./... 2> sn_report_vet_report.out
  golangci-lint run --out-format checkstyle ./... > sn_report_report.xml || true
  nilaway ./... > sn_report_nilaway.out || true
IvanWhisper
go · 目录
上一篇nacos集群部署实战指北
阅读 326
 
 
关注公众号后可以给作者发消息
 
 
 
 
 
 
 
posted @   技术颜良  阅读(229)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2023-03-22 Ubuntu 20.0.4(戴尔R620)和锐捷RG-6120交换机进行端口聚合bond操作
2023-03-22 Ubuntu18.04设置bond0
2022-03-22 Kubernetes之网络策略(Network Policy)
2022-03-22 Docker系列五——Docker容器隔离原理及网络通信(重要)
2022-03-22 【Docker 基础知识】存储驱动overlay和overlay2
2022-03-22 linux 六种命名空间
2022-03-22 Linux内核网络丢包查看工具dropwatch的安装和使用
点击右上角即可分享
微信分享提示