go fixが完全に生まれ変わった
2026年2月にリリースされたGo 1.26で、go fixサブコマンドが完全に書き直されました。以前のgo fixは比較的シンプルなリファクタリングツールでしたが、新しいバージョンではコードベースを最新のGo機能に合わせて自動的にモダナイズする本格的なツールに進化しています。
Go 1.18でジェネリクスが導入されて以降、言語仕様やライブラリに多くの改善が加わってきました。たとえば、マップのキーをスライスに集める処理は、以前はループで書く必要がありましたが、今はmaps.Keysという関数一つで済みます。こうした「最新の書き方に置き換えられるパターン」を自動検出して修正してくれるのが、新しいgo fixの役割です。
基本的な使い方
使い方はとてもシンプルです。プロジェクトのルートディレクトリで以下のコマンドを実行するだけで、配下の全パッケージが対象になります。
$ go fix ./...
成功するとソースファイルが直接更新されます。変更内容を事前に確認したい場合は、-diffフラグを使うと差分だけを表示してくれるので安心ですね。
$ go fix -diff ./...
実行前にgitの状態をクリーンにしておくと、go fixによる変更だけを一つのコミットにまとめやすくなります。コードレビューする側にとっても、変更の意図が明確になるのでおすすめです。
どんな修正が自動で行われるのか
go fixには複数の「フィクサー(fixer)」が組み込まれており、それぞれが特定のパターンを検出して修正します。利用可能なフィクサーの一覧は以下のコマンドで確認できます。
$ go tool fix help
主なフィクサーをいくつか紹介しますね。
anyフィクサー
interface{}をanyに置き換えます。Go 1.18で導入されたエイリアスですが、既存のコードベースには古い書き方が残っていることが多いです。見た目もスッキリするので、地味に嬉しい修正です。
forvarフィクサー
Go 1.22以前は、forループ内でx := xのように変数を再宣言して各イテレーションで新しい変数を確保する書き方が一般的でした。Go 1.22でforループのセマンティクスが変更されたため、このパターンは不要になっています。forvarフィクサーはこの冗長な再宣言を自動で除去してくれます。
minmaxフィクサー
if/elseで書かれた最小値・最大値の比較ロジックを、組み込み関数のmin/maxに置き換えます。可読性が格段に上がるので、個人的にはこれが一番インパクトの大きい修正だと感じました。
mapsloopフィクサー
マップに対する明示的なループを、mapsパッケージの関数呼び出しに置き換えます。ジェネリクスの恩恵を受けた新しいAPIを活用する形ですね。
特定のフィクサーだけを実行する方法
大規模なプロジェクトでは、すべてのフィクサーを一度に適用するとレビューの負担が大きくなることがあります。そういう場合は、フラグで特定のフィクサーだけを有効にできます。
$ go fix -any ./... # anyフィクサーのみ
$ go fix -any=false ./... # any以外の全フィクサー
段階的に適用してコミットを分けることで、コードレビューのハードルを下げられるのは実用的だなと思います。
クロスプラットフォーム対応
go fixはgo buildと同様に、一度の実行で特定のビルド構成のみを解析します。複数のOS・アーキテクチャ向けにタグ付けされたファイルがある場合は、GOOSとGOARCHを変えて複数回実行すると網羅性が上がります。
$ GOOS=linux GOARCH=amd64 go fix ./...
$ GOOS=darwin GOARCH=arm64 go fix ./...
$ GOOS=windows GOARCH=amd64 go fix ./...
複数回実行することで「相乗的な修正」が見つかるケースもあるそうです。
セルフサービス分析ツールとしての拡張性
今回のgo fixの刷新では、モジュールメンテナーや組織が独自のガイドラインやベストプラクティスをツールに組み込める「セルフサービス」分析ツールとしての方向性も示されています。
これはRustのclippyのような「リンターを超えた自動修正」のアプローチに近いものと言えそうです。静的解析の基盤を活かして、プロジェクト固有のコード品質ルールを適用できるようになれば、大規模チームでの開発生産性がさらに向上するでしょう。
実際に使ってみた所感
Go言語はバージョンアップのたびに新機能が追加される一方で、後方互換性を非常に大切にしています。そのため、古い書き方でも動き続けてしまい、コードベースが「動くけど古い」状態になりがちです。
go fixはその問題に対する公式の回答で、「ツールチェーンを更新したらgo fixを回す」という習慣を取り入れるだけで、コードベースを常にモダンな状態に保てます。AIコーディングエージェントに頼る前に、まず公式ツールでできることをやるのが大事かもしれません。
まとめ
Go 1.26のgo fixは、レガシーコードを自動的に最新のイディオムに変換してくれる実用的なツールに生まれ変わりました。-diffでの事前確認、フィクサーの個別実行など、実務に配慮した設計も好印象です。
詳しくはGo公式ブログの記事やgoコマンドのドキュメントをチェックしてみてください。
