⭐️ 实用的 Golang 工具,让你的代码再次变得出色
介绍
大家好,令人惊叹的 DEV 朋友们!👋
上周我一直在重构我的 Go 项目。我意识到我竟然用同样的工具来检查所有地方的代码质量和安全性。没错,为了保持代码库的整洁有序,确实应该时不时地这样做(这不仅适用于编程,也适用于日常生活)。
🚀顺便说一句,本文并非讨论 VS Code 或类似Go插件中内置的 linters 和格式化程序!这些是来自不同作者的不同项目,你可以将它们添加到你的编程周期中。
那么,为什么不告诉我的读者一些有用的工具呢?快来试试吧!👇
📝 目录
为什么它很重要以及我对 Go 项目的愿景
我必须告诉你:我喜欢写代码。但更重要的是,我喜欢阅读其他开发人员写的结构化代码。
为什么?它有助于更好地理解作者,采用有用的技术和方法,以及理解特定功能和整个包的工作!
因此,我非常注重工具的使用,以便于更容易地编写代码,并最终方便之后阅读代码。我鼓励你也谨慎使用我在本文中介绍的技巧和工具……毕竟,你写的代码可能还在被别人阅读。
正确设置环境
首先,.editorconfig
我的所有 Go 项目的默认设置如下所示:
# ./.editorconfig
root = true
[*] # <-- rules for all files
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[{go.mod,go.sum,*.go}] # <-- rules only for Go's project files
indent_style = tab
indent_size = 4
# ...other rules...
第二点,但与第一点同样重要,始终使用默认设置更新Visual Studio Code的Go 插件(我上面提到过)。

gosec 包
gosec
通过扫描 Go AST 检查源代码是否存在安全问题。此软件包包含30多种不同的规则,可用于测试 Go 代码的安全性。
☝️注意:在计算机科学中,抽象语法树(AST)或语法树是用编程语言编写的源代码的抽象语法结构的树形表示。
下面是我的一个项目中的示例。我gosec ./...
在模块的根目录中调用该命令:
[gosec] 2021/10/25 18:03:37 Including rules: default
[gosec] 2021/10/25 18:03:37 Excluding rules: default
[gosec] 2021/10/25 18:03:37 Import directory: /Users/koddr/Code/project/api/app/models
[gosec] 2021/10/25 18:03:37 Checking package: models
# ...list of all *.go files...
Results:
[/Users/koddr/Code/project/api/platform/cdn/digitalocean_spaces.go:62] - G304 (CWE-22): Potential file inclusion via variable (Confidence: HIGH, Severity: MEDIUM)
61: // Open the file from system path.
> 62: file, errOpen := os.OpenFile(pathToFile, os.O_RDONLY, 0o600)
63: if errOpen != nil {
Summary:
Gosec : 2.9.1
Files : 29
Lines : 2760
Nosec : 0
Issues : 1
这给了我很多修复它的信息!你可以用Golang 内置的函数包装pathToFile
变量,轻松修复这部分代码。filepath.Clean()
🤔注意:是的,乍一看这可能看起来很奇怪,但如果你曾经在生产中运行过 Go 项目,你就会明白为什么你不能把这些东西排除在你的代码之外。
go-critic 包
这go-critic
是一系列用于检测代码风格、性能问题以及一些常见编程错误的检查工具。它提供了尽可能多的实用检查。这个出色的工具不仅可以显示 Go 代码中存在问题的部分,还能告诉您应该用什么来替换它。
例如,让我们运行gocritic check -enableAll ./...
流行的 Swagger 文档生成器包swaggo/swag
:
./operation.go:1033:24: ioutilDeprecated: ioutil.ReadFile is deprecated, use os.ReadFile instead
./parser.go:604:1: paramTypeCombine: func(tagName string, dirPath string) ([]byte, error) could be replaced with func(tagName, dirPath string) ([]byte, error)
./packages.go:41:5: emptyStringTest: replace `len(packageDir) == 0` with `packageDir == ""`
# ...and over 20 more...
如果目前您不需要某个规则组,只需通过disable
带有标签的标志将其禁用,如下所示:
gocritic check -disable='#style' ./...
支持的标签(始终启用):
#diagnostic
— 检测各种错误的检查类型#style
— 发现样式问题的检查类型#performance
— 检测潜在性能问题的检查类型#security
— 发现安全问题的检查类型
以及默认禁用的标签(通过-enable='<TAG>'
带有特定标签的标志启用它,或使用-enableAll
标志):
#experimental
— 检查正在测试和开发中#opinionated
— 有些人可能不想要支票
要关闭特定规则,只需运行此命令:
gocritic check -disable=emptyStringTest ./...
☝️注意:您可以在此处找到所有规则的完整列表。
golangci-lint 包
这golangci-lint
是一款快速的 Go 代码检查器。该软件包的大多数安装都是为 CI 执行的,但您也可以将其用作您常用的 IDE 中的标准代码检查器。
golangci / golangci-lint
Go 的快速 linters 运行器
主要优点:
- 并行运行 linters,重用 Go 构建缓存并缓存分析结果
- 基于 YAML 的配置
- 包含许多 linters,无需安装
- 由于调整了默认设置,误报数量最少
- 带有颜色、源代码行和标记标识符的漂亮输出
是的,就我个人而言,我经常将它与 GitHub Actions 一起使用来检查存储库中项目的所有传入 PR。
📌注意:如果您错过了,这里有我的一系列文章,它们将为您提供有关 GitHub Actions 的深入了解和实践。
Actions 的配置文件如下所示,例如:
# ./.github/workflows/golangci-lint.yml
name: golangci-lint
on:
push:
branches:
- master
pull_request:
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: latest
only-new-issues: true
# ...
开发人员提供的一个小演示,golangci-lint
展示了 Beego Web 框架的问题区域(通过golangci-lint run
命令):
然后
希望本文对您有所帮助。如果您还有其他检查和格式化代码的好工具,请在评论区留言。别忘了花点时间,让您的代码再次变得优秀。
非常值得! 😉
照片和视频来自
- 工具作者和 Vic Shóstak
聚苯乙烯
如果你想在本博客上看到更多类似的文章,请在下方留言并订阅我。谢谢!😻
❗️ 您可以在Boosty上支持我,可以是永久支持,也可以是一次性支持。所有收益都将用于支持我的开源项目,并激励我为社区创作新的产品和文章。
当然,你也可以帮助我改善开发者的生活!只需以贡献者的身份连接到我的一个项目即可。非常简单!
我的主要项目需要您的帮助(和星星)👇
- 🔥 gowebly:下一代 CLI 工具,可轻松使用 Go 在后端创建出色的 Web 应用程序,使用 htmx、hyperscript 或 Alpine.js 以及前端最流行的 CSS 框架。
- ✨ create-go-app:通过运行一个 CLI 命令,创建一个具有 Go 后端、前端和部署自动化的新的生产就绪项目。
我的其他小项目:yatr、gosl、json2csv、csv2api。
鏂囩珷鏉ユ簮锛�https://dev.to/koddr/helpful-golang-tools-to-make-your-code-great-again-3739