首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go1.24: 除了标准库之外,您也许应该更加关注 Go 工具的变化

Go1.24: 除了标准库之外,您也许应该更加关注 Go 工具的变化

作者头像
萝卜要努力
发布2025-03-07 16:11:34
发布2025-03-07 16:11:34
28500
代码可运行
举报
文章被收录于专栏:萝卜要加油萝卜要加油
运行总次数:0
代码可运行

Go 1.24 引入了许多工具方面的重要更新,这些更新让开发者在管理依赖、调试问题以及编写更高质量代码时变得更加高效。尽管人们通常会将注意力集中在标准库或语言特性上的变化,但 Go 工具生态系统的改进同样值得关注。在本文中,我们将重点探讨两个关键领域的改进:go toolvet工具,并通过实际示例展示这些更新如何优化你的工作流程。

Go 命令的增强功能

在 Go 1.24 中,go 命令进行了多项改进,使得依赖管理和工具执行更加高效且易于使用。其中最显著的变化之一是 go.mod 文件中新增了 tool 指令,允许你直接跟踪可执行工具依赖,而无需依赖诸如空导入等不直观的解决方案。

使用 Tool 指令跟踪可执行工具依赖

我们在项目中大量使用mockery[1](一个流行的 Mock 代码生成器),使用方式是通过brew 安装或者直接下载特定版本的exe 执行文件。但是这样有个问题,如果不同开发者使用的mockery 版本不一致,会造成非预期的代码冲突。在过去,如果您想将这样的工具作为项目的一部分,你需要创建一个文件(通常命名为 tools.go),并通过空导入来声明这些工具。比如 go-modules-by-example[2] 中的 stringer 而在 Go 1.24 中,你可以直接在 go.mod 文件中使用新的 tool 指令来显式声明这些依赖。例如:

代码语言:javascript
代码运行次数:0
运行
复制
# 使用新 tool 指令安装 mockery$ gotip get -tool github.com/vektra/mockery/v2@v2.52.1

这条命令会在你的 go.mod 文件中添加一个 tool 指令:

代码语言:javascript
代码运行次数:0
运行
复制
module huizhou92.com/tools    go 1.24    tool github.com/vektra/mockery/v2    require (      github.com/vektra/mockery/v2 v2.52.1 // indirect    ....)

现在,你可以通过 gotip install tool 安装特定版本的工具,或者直接使用下面的命令运行 mockery

代码语言:javascript
代码运行次数:0
运行
复制
gotip tool github.com/vektra/mockery/v2 --all  --output ./mocks

我本地安装的mockery是2.32.3

这种方式消除了单独管理安装过程或维护专门文件的需求。

缓存可执行文件以加速运行 #69290[3]

另一个改进是,通过诸如 go run 或通过 go tool 执行的命令生成的可执行文件,现在会被缓存到 Go 的构建缓存中(Go 1.24 之前,cmd/go 仅缓存编译后的包文件)。这一改变显著加快了重复执行的速度。但是这样会增加缓存的使用。

Go 会自动清理五天前[4]的编译后的包文件的缓存, 对于可执行文件的缓存,这个数字可能会是 2天。

如果你正在开发过程中频繁使用自定义工具或脚本,这种缓存机制能够节省宝贵时间。

Vet 工具的增强功能

Go 的静态分析工具 Vet 在 1.24 中新增了一些分析器,并改进了诊断能力,可以帮助开发者更早地发现潜在问题和常见错误。

新增 Tests 分析器

一个亮点是新增了 Tests 分析器,它可以识别测试声明中的问题,例如名称格式错误、不正确的函数签名或文档化不存在标识符的问题。这些问题可能导致测试未按预期运行。

例如,以下代码存在错误:

代码语言:javascript
代码运行次数:0
运行
复制
// 错误的测试函数签名(缺少 *testing.T 参数)func TestMyFunction() {    fmt.Println("This test will not run")}

运行 go vet ./... 将会产生如下诊断信息:

代码语言:javascript
代码运行次数:0
运行
复制
blog-example/go/go1.24/tools/demo_test.go:5:1: wrong signature for TestMyFunction, must be: func TestMyFunction(t *testing.T)

通过提前捕获此类错误,可以确保所有测试都能正确运行,而不会在 CI/CD 流程中出现意外问题。

改进 Printf 分析器

现有的 Printf 分析器也得到了升级,可以检测到非常量格式字符串被传递但没有附加参数的问题——这通常会导致运行时错误或意外行为。例如:

代码语言:javascript
代码运行次数:0
运行
复制
s := "Hello %s"fmt.Printf(s) // 如果 s 包含格式化占位符,将导致运行时问题。

Go1.23 版本不会出现错误,借助 Go 1.24 改进后的 Vet 工具诊断能力,会提示如下信息:

代码语言:javascript
代码运行次数:0
运行
复制
➜  tools git:(main) ✗ go vet ./...➜  tools git:(main) ✗ gotip vet ./...# blog-example/go/go1.24/tools# [blog-example/go/go1.24/tools]./demo_test.go:10:13: non-constant format string in call to fmt.Printf

要修复此问题,只需将 fmt.Printf(s) 替换为不需要格式化参数时更合适的方法,例如:fmt.Print(s)

结论

Go1.24 中还对以下工具进行了修改或者增强

  • Go build支持生成伪版本号 #50603[5]
  • 默认使能GOCACHEPROG以支持外部缓存 #64876[6]
  • go 工具链支持HTTP扩展认证:GOAUTH#26232[7]
  • go build支持-json #62067[8]
  • ....

Go 1.24 中对工具生态系统的更新表明,即使是看似微小但实用性的变化,也能极大地提升开发者生产力和代码质量。通过 tool 指令直接跟踪可执行工具依赖,简化了依赖管理并减少了样板代码。而 vet 工具增强后的诊断能力,则帮助开发者更早地发现潜在 Bug 和常见错误,从而避免后续阶段的问题。

随着 Go 的不断发展,密切关注这些工具方面的改进,可以确保你不仅充分利用标准库和语言特性,还能最大限度地提高开发效率与代码可靠性。

引用链接

[1]mockery: https://github.com/vektra/mockery

[2]go-modules-by-example: https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md

[3]#69290: https://github.com/golang/go/issues/69290

[4]trimLimit: https://github.com/golang/go/blob/2707d42966f8985a6663c93e943b9a44b9399fca/src/cmd/go/internal/cache/cache.go#L335

[5]#50603: https://github.com/golang/go/issues/50603

[6]#64876: https://github.com/golang/go/issues/64876

[7]#26232: https://github.com/golang/go/issues/26232

[8]#62067: https://github.com/golang/go/issues/62067

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜要加油 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go 命令的增强功能
    • 使用 Tool 指令跟踪可执行工具依赖
    • 缓存可执行文件以加速运行 #69290[3]
  • Vet 工具的增强功能
    • 新增 Tests 分析器
    • 改进 Printf 分析器
  • 结论
  • 引用链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档