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

 

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 指令来显式声明这些依赖。例如:

1
2
# 使用新 tool 指令安装 mockery
$ gotip get -tool github.com/vektra/mockery/v2@v2.52.1

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
module your-project.com  

go 1.24  

tool github.com/vektra/mockery/v2  

require (  
    github.com/vektra/mockery/v2 v2.52.1 // indirect  
    ...  
)

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

1
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 分析器,它可以识别测试声明中的问题,例如名称格式错误、不正确的函数签名或文档化不存在标识符的问题。这些问题可能导致测试未按预期运行。

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

1
2
3
4
// 错误的测试函数签名(缺少 *testing.T 参数)
func TestMyFunction() {
    fmt.Println("This test will not run")
}

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

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

1
s := "Hello %s"fmt.Printf(s) // 如果 s 包含格式化占位符,将导致运行时问题。

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

1
  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


  • 本文长期链接
  • 如果您觉得我的博客对你有帮助,请通过 RSS订阅我。
  • 或者在X上关注我。
  • 如果您有Medium账号,能给我个关注嘛?我的文章第一时间都会发布在Medium。
Licensed under CC BY-NC-SA 4.0
最后更新于 Feb 02, 2025 12:00 CST
使用 Hugo 构建
主题 StackJimmy 设计