Introduction
The Go 1.26 release introduces a completely rewritten go fix subcommand that automates the modernization of your Go codebase. Instead of manually hunting for outdated patterns or deprecated APIs, go fix runs a collection of smart analyzers that detect and fix common issues—like replacing interface{} with any, converting string splits to strings.Cut, or simplifying loop variables. This guide walks you through the entire process, from setup to advanced usage, ensuring you can safely and efficiently bring your code up to date with the latest Go idioms.
What You Need
- Go 1.26 or later installed on your machine.
- A clean Git working tree (or other version control) so you can easily review changes.
- An existing Go project with packages to fix.
- Basic familiarity with the command line and Go modules.
Step-by-Step Instructions
Step 1: Prepare Your Working Environment
Before running go fix, ensure your repository is in a known state. Commit or stash any pending changes. This makes it trivial to distinguish modifications made by the tool from your own edits. A clean state also simplifies code review—reviewers will see exactly what the fixers changed.
Step 2: Run go fix on Your Entire Project
Navigate to the root of your module and execute:
go fix ./...
This command applies all applicable fixers to every package in the directory tree. By default, go fix modifies the source files in place and outputs nothing on success. It skips generated files (recognized by a // Code generated comment) because the appropriate fix should be applied at the generator level instead.
Step 3: Preview Changes With the -diff Flag
If you prefer to inspect modifications before they are applied, use the -diff flag:
go fix -diff ./...
This prints a unified diff to the terminal without altering any files. For example, you might see:
--- dir/file.go (old)
+++ dir/file.go (new)
- eq := strings.IndexByte(pair, '=')
- result[pair[:eq]] = pair[1+eq:]
+ before, after, _ := strings.Cut(pair, "=")
+ result[before] = after
…
Review the diff carefully to ensure you understand each transformation. Once satisfied, you can apply the same changes by running go fix without -diff.
Step 4: List Available Fixers
To see all analyzers that go fix can run, use:
go tool fix help
This prints a list like:
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
…
Step 5: Get Detailed Help for a Specific Fixer
Each analyzer has its own documentation. For example, to learn about the forvar fixer, run:
go tool fix help forvar
This will show a description, before/after examples, and any limitations. Reading this help can help you decide which fixers are relevant to your codebase.

Step 6: Run Only Specific Fixers (Optional)
If you want to apply only a subset of fixers—for instance, just the any and mapsloop analyzers—you can pass their names as arguments:
go fix -fix=any,mapsloop ./...
This gives you fine-grained control over the modernization process, allowing you to tackle one category of change at a time.
Step 7: Review and Commit the Changes
After running go fix, inspect the modified files. Use your version control system to see what changed. We recommend committing these changes in a single, well-described commit like “go fix: modernize code to Go 1.26 patterns.” This practice keeps your project history clean and makes it easy for teammates to understand the scope of the update.
Tips for a Smooth Experience
- Run after every Go toolchain upgrade. New versions of Go may introduce additional fixers. Running
go fixright after updating ensures your code keeps pace with language evolution. - Use version control religiously. As mentioned earlier, starting from a clean state lets you isolate and review each fixer’s impact. It also provides an easy rollback path if something goes wrong.
- Don’t ignore generated files. While
go fixskips them, you should update the generators themselves to produce modern code. This prevents the fixes from being reverted on the next generation run. - Combine with
go vet. Run both tools as part of your CI pipeline or commit hooks.go vetcatches semantic issues, whilego fixmodernizes syntax—together they keep your code healthy. - Test after fixing. Although
go fixis designed to be safe, always run your project’s tests after applying changes to confirm nothing broke. - Consider custom analyzers. The new
go fixinfrastructure is built on thegolang.org/x/tools/go/analysisframework. Module maintainers can write their own analyzers that encode team-specific guidelines, such as banning certain imports or enforcing naming conventions. Explore the “self-service” analysis model to scale best practices across your organization.
By following these steps, you can confidently modernize your Go codebase with every release. The go fix command saves time, reduces human error, and helps you adopt idiomatic patterns as the language evolves. Start using it today!