> ## Content Index
> Fetch the complete content index at: https://huizhou92.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Go1.24: 除了标准库之外，您也许应该更加关注 Go 工具的变化
- URL: https://huizhou92.com/go1-24-chu-liao-biao-zhun-ku-zhi-wai-nin-ye-xu-ying-gai-geng-jia-guan-zhu-go-gong-ju-de-bian-hua/
- Published: 2025-02-02T04:00:49.000Z
- Updated: 2026-09-06T11:41:19.000Z
- Author: huizhou92
- Tags: tech, golang, go, #lang-zh-cn

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

## **Go 命令的增强功能**

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

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

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

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

```

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

```go
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`：

```shell
gotip tool github.com/vektra/mockery/v2 --all  --output ./mocks

```

![](https://images.hxzhouh.com/blog-images/2025/02/7d09cc710493d907cc1e93dbd08ecce2.png)  
我本地安装的mockery是2.32.3  
![](https://images.hxzhouh.com/blog-images/2025/02/165bf2d809cab69b80c903110ad70c5d.png)  
这种方式消除了单独管理安装过程或维护专门文件的需求。

### 缓存可执行文件以加速运行 [#69290](https://github.com/golang/go/issues/69290?ref=huizhou92.com)\[3\]

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

> Go 会自动清理[五天前](https://github.com/golang/go/blob/2707d42966f8985a6663c93e943b9a44b9399fca/src/cmd/go/internal/cache/cache.go?ref=huizhou92.com#L335)\[4\]的编译后的包文件的缓存， 对于可执行文件的缓存，这个数字可能会是 2天。

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

## **Vet 工具的增强功能**

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

### **新增 Tests 分析器**

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

例如，以下代码存在错误：

```go
// 错误的测试函数签名（缺少 *testing.T 参数）
func TestMyFunction() {
    fmt.Println("This test will not run")
}

```

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

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

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

```

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

```go
➜  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](https://github.com/golang/go/issues/50603?ref=huizhou92.com)\[5\]
- 默认使能GOCACHEPROG以支持外部缓存 [#64876](https://github.com/golang/go/issues/64876?ref=huizhou92.com)\[6\]
- go 工具链支持HTTP扩展认证：GOAUTH[#26232](https://github.com/golang/go/issues/26232?ref=huizhou92.com)\[7\]
- go build支持-json [#62067](https://github.com/golang/go/issues/62067?ref=huizhou92.com)\[8\]
- ....

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

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

## 引用链接

\[1\]mockery: \_[https://github.com/vektra/mockery\_](https://github.com/vektra/mockery%5F?ref=huizhou92.com)

\[2\]go-modules-by-example: \_[https://github.com/go-modules-by-example/index/blob/master/010\_tools/README.md\_](https://github.com/go-modules-by-example/index/blob/master/010%5Ftools/README.md%5F?ref=huizhou92.com)

\[3\]#69290: \_[https://github.com/golang/go/issues/69290\_](https://github.com/golang/go/issues/69290%5F?ref=huizhou92.com)

\[4\]trimLimit: \_[https://github.com/golang/go/blob/2707d42966f8985a6663c93e943b9a44b9399fca/src/cmd/go/internal/cache/cache.go#L335\_](https://github.com/golang/go/blob/2707d42966f8985a6663c93e943b9a44b9399fca/src/cmd/go/internal/cache/cache.go?ref=huizhou92.com#L335%5F)

\[5\]#50603: \_[https://github.com/golang/go/issues/50603\_](https://github.com/golang/go/issues/50603%5F?ref=huizhou92.com)

\[6\]#64876: \_[https://github.com/golang/go/issues/64876\_](https://github.com/golang/go/issues/64876%5F?ref=huizhou92.com)

\[7\]#26232: \_[https://github.com/golang/go/issues/26232\_](https://github.com/golang/go/issues/26232%5F?ref=huizhou92.com)

\[8\]#62067: \_[https://github.com/golang/go/issues/62067\_](https://github.com/golang/go/issues/62067%5F?ref=huizhou92.com)

---

- [本文长期链接](https://huizhou92.com/go1-24-chu-liao-biao-zhun-ku-zhi-wai-nin-ye-xu-ying-gai-geng-jia-guan-zhu-go-gong-ju-de-bian-hua)
- 如果您觉得我的博客对你有帮助，请通过 [RSS](https://huizhou92.com/sitemap.xml)订阅我。
- 或者在[X](https://x.com/@piaopiaopig?ref=huizhou92.com)上关注我。
- 如果您有[Medium](https://medium.huizhou92.com/?ref=huizhou92.com)账号，能给我个关注嘛？我的文章第一时间都会发布在Medium。