Modernizing Your Go Code with the New go fix Command
With the release of Go 1.26, the go fix command has been completely rewritten to help you automatically modernize your Go codebase. It applies a suite of analysis tools that identify opportunities to use more recent language and library features, making your code cleaner, safer, and easier to maintain. Below we answer common questions about using and understanding this powerful new tool.
1. What is the go fix command and how does it work?
The go fix command, like go build and go vet, accepts package patterns. It analyzes source files for patterns that can be improved using modern Go features. On success, it silently updates the source files with the recommended fixes. It automatically skips generated files because the appropriate fix for generated code is to change the generator itself. You should run go fix over your entire project every time you upgrade your toolchain to a newer release. Starting from a clean git state helps reviewers focus only on the automated changes.
2. How do I run go fix on my project?
To fix all packages in the current directory and its subdirectories, use:
$ go fix ./...
This command will apply all registered fixers to your Go source files. Because it can modify hundreds of files, it's good practice to begin with a clean version control state. That way, the diff shows only the exact changes made by go fix, which simplifies code review. The tool silently fixes issues without prompting; you can always preview changes before committing.
3. Can I preview changes before applying them?
Yes, use the -diff flag to see what would be changed without actually modifying files. For example:
$ go fix -diff ./...
This outputs a unified diff for each affected file, showing old and new code. The diff clearly illustrates how fixers transform your code, for instance replacing manual string splitting with the cleaner strings.Cut function. This preview is invaluable when reviewing automated changes or understanding what a particular fixer does.
4. How can I see which fixers are available?
Run go tool fix help to list all registered analyzers. Each entry includes a name and brief description:
$ go tool fix help
Registered analyzers:
any replace interface{} with any
buildtag check //go:build and // +build directives
fmtappendf replace []byte(fmt.Sprintf) with fmt.Appendf
forvar remove redundant re-declaration of loop variables
hostport check format of addresses passed to net.Dial
inline apply fixes based on 'go:fix inline' comment directives
mapsloop replace explicit loops over maps with calls to maps package
minmax replace if/else statements with calls to min or max
...
For complete documentation of a specific fixer, add its name to the command, for example go tool fix help forvar.

5. What does the forvar fixer do and why is it important?
The forvar fixer removes unnecessary shadowing of loop variables. Before Go 1.22, loop variables were reused across iterations, which caused bugs when goroutines captured them. Developers commonly added a redundant re-declaration inside the loop to create a fresh variable. Starting with Go 1.22, loop variables have per-iteration scoping, making this workaround unnecessary. The fixer automatically deletes the redundant declaration, cleaning up the code and reducing lint noise. For example, code like for _, v := range list { v := v; ... } becomes simply for _, v := range list { ... }.
6. What are some other notable fixers in go fix?
Several fixers bring your code up to date with recent Go conventions. The any fixer replaces interface{} with the more concise any alias. The fmtappendf fixer converts []byte(fmt.Sprintf(...)) to the more efficient fmt.Appendf pattern. The mapsloop fixer replaces manual map iteration with functions from the maps package. For networking code, hostport validates address formatting passed to net.Dial. The minmax fixer replaces explicit if/else statements with calls to min or max. Each fixer helps maintain consistency and adopt best practices across your codebase.
Related Articles
- GitHub Strengthens SSH Security with Post-Quantum Key Exchange: What You Need to Know
- Kubernetes v1.36: 7 Essential Insights Into Manifest-Based Admission Control
- Go 1.26 Revolutionizes Code Modernization: Source-Level Inliner Now Part of 'go fix'
- Go Team Launches 2025 Developer Survey: Feedback to Shape Future of Language
- Securing Your Node.js Applications: A Step-by-Step Guide to Addressing vm2 Sandbox Vulnerabilities
- Microsoft Unveils Agent Governance Toolkit to Secure AI Tool Calls in .NET
- IntelliJ IDEA Mastery Series Launches: Developer Productivity Secrets Revealed
- Go 1.26 Unveils Source-Level Inliner: Self-Service API Migrations Now Possible