SeriesPart 9 of 9 // Go 1.24
GoWriting
Feb 9, 2025
5 min read

Enhancements to Go Tooling in 1.24: go vet, go build, and More

Go 1.24 brings significant improvements to its tooling, making development, debugging, and dependency management more efficient. This…

Go 1.24 brings significant improvements to its tooling, making development, debugging, and dependency management more efficient. This…

Enhancements to Go Tooling in 1.24: go vet**,** go build**, and More**

Go 1.24 brings significant improvements to its tooling, making development, debugging, and dependency management more efficient. This update enhances go vet, introduces JSON output for go build and go test, improves caching mechanisms, and refines authentication for private module fetches. Go 1.24 also introduces significant improvements to the compiler and linker, focusing on performance and debugging. These changes make Go programs compile faster and enable better debugging.

1. Improved Static Analysis with go vet

go vet now includes more robust checks, helping developers catch common issues before they reach production.

New Test Analyser

The new test analyser reports common mistakes in test declarations, such as:

  • Malformed test, benchmark, or fuzz function names.
  • Incorrect function signatures.
  • Examples that reference non-existent identifiers.

Example: Catching a Malformed Test Name

package main
 
import "testing"
 
func BenchmarktestFunction(b *testing.B) { // Incorrect: should be BenchmarkTestFunction
  for i := 0; i < b.N; i++ {
    _ = i * i
  }
}

Running go vet ./... would flag this error, preventing incorrect benchmarks from silently failing.

Enhanced printf Analyser

go vet now detects cases where fmt.Printf is mistakenly used with a dynamic format string without arguments.

Example:

package main
 
import "fmt"
 
func main() {
  s := "Value: %d"
  fmt.Printf(s) // Warning: %d expects an argument
}

go vet will warn about this mistake and suggest using fmt.Print instead.

2. Structured JSON Output for go build and go test

To better integrate with CI/CD pipelines, go build and go test now support structured JSON output.

Example: JSON Output for go build

go build -json ./...

This produces structured logs that make it easier to analyse build failures programmatically.

Example: JSON Output for go test

go test -json ./...

This extends the JSON format to include both test results and build errors, making it easier to debug failing tests.

3. Improved Caching for go run and go tool

Executables created by go run and go tool are now cached, improving performance for repeated executions.

Example: Caching in Action

go run myscript.go # First run compiles and caches the binary

Subsequent runs will execute faster since Go reuses the cached binary instead of recompiling it.

4. go get Enhancements and Tool Tracking

Go modules can now track executable dependencies using tool directives in go.mod, replacing the previous tools.go workaround.

Example: Adding a Tool Directly to go.mod

Instead of requiring a separate tools.go file, developers can now add tools directly to go.mod:

tool golang.org/x/tools/cmd/stringer

This ensures the tool is explicitly managed by Go modules, making dependency tracking more straightforward.

Alternatively, the -tool flag can be used:

go get -tool golang.org/x/tools/cmd/stringer

Additionally, go install tool allows for installing all tools tracked in go.mod:

go install tool

This streamlines environment setup and dependency management.

5. Authentication for Private Module Fetches (GOAUTH)

The new GOAUTH environment variable provides a flexible authentication mechanism for fetching private modules. See go help goauth for more information. This allows Go to use stored credentials for private repository access without requiring manual authentication prompts.

6. Faster Compilation and Optimized Code Generation

Go 1.24 includes optimizations that reduce compilation time and runtime overhead.

Key Improvements:

  • Better register allocation: The compiler now optimizes how registers are assigned, reducing redundant memory accesses.
  • Faster function inlining: Improves execution speed by reducing function call overhead.
  • More efficient stack frame layout: Reduces stack memory usage and improves function calls.

Example: Measuring Compilation Time Before and After Go 1.24

2. Improved Debugging with GNU Build ID and Mach-O UUID

Go 1.24 now generates GNU build IDs (for Linux ELF binaries) and Mach-O UUIDs (for macOS binaries). These IDs make debugging and symbol management easier.

Checking the Build ID on Linux

readelf -n myapp | grep "Build ID"

Checking the Mach-O UUID on macOS

otool -l myapp | grep "UUID"

Conclusion

Go 1.24 significantly enhances its tooling, making development workflows more efficient and reliable. From improved static analysis and structured logging to better caching and authentication, these updates streamline development, testing, and deployment. Moreover, the Go 1.24 compiler and linker bring faster builds, smaller binaries, and better debugging support — ensuring Go remains efficient for modern application development.

By Ajitem Sahasrabuddhe on February 9, 2025.

Series contents