本記事でやること
Go1.26で大幅に強化された go fix コマンドを実際のプロダクションコードに適用した際に遭遇した注意点を共有します。
注意
この記事は2026年2月13日時点の情報をもとに記載したものです。今後のGo言語や周辺ツールのアップデートにより、本記事で紹介している問題は解消される可能性があります。
対象読者
- Goを業務で使っている方
- Go1.26へのアップデートを検討している方
-
go fixコマンドの適用を考えている方
go fix コマンドとは
go fix は、古いGoの書き方を最新バージョンに沿ったイディオムへ自動的に書き換えてくれるコマンドです。Go1.26でこのコマンドが大幅に強化され、interface{} → any への統一やループ変数の再代入の削除、strings.Builder への書き換え、新しい new 関数への置換などを一括で行ってくれるようになりました。
go fix ./...
実行自体は非常に簡単ですが、実際にCIを通したり開発環境で動かしてみるといくつかの問題に遭遇しました。
困ったこと
1. ジェネリクスを使ったポインタ変換関数をnew関数に置換しれくれない場合がある
プリミティブ型のポインタを返す関数として、ジェネリクスを使った以下のようなユーティリティ関数をよく見かけます。
func ToPtr[T any](v T) *T {
return &v
}
Go1.26では new 関数が拡張され値を引数に取れるようになったため、go fix は型ごとに定義された StringPtr や IntPtr のようなヘルパー関数を new に置換してくれます。しかし、ToPtr 関数を呼び出している箇所をnew関数に置換してくれない場合があります。
OKなケース
プリミティブな型の値や関数を受け取っている場合はnew関数への置換が行われます。
// Before
hello := ToPtr("hello")
myFunc := ToPtr(MyFunc())
// After go fix によってnew関数に置換してくれる
hello := new("hello")
myFunc := new(MyFunc())
NGなケース
別パッケージ(other)で定義した以下の値を入力している場合はnew関数に置換はされません。
- 定数(
MyConst) - 独自型(
MyType) - 型エイリアス(
MyAlias)
package other
const MyConst = "Hoge"
type MyType string
type MyAliasType = string
ToPtr(other.MyConst)
ToPtr(other.MyType("hoge"))
ToPtr(other.MyAliasType("hoge"))
コードベース全体で ToPtr を使っている場合、手動で置換する必要があります。この問題はすでにissueとして報告されています。
2. staticcheckが new(値) パターンを誤検知する
staticcheck(SA4006ルール)は「使用されていない値」を検出するツールですが、Go1.26の新しい new(値) パターンをまだ認識できていません。
そのため、以下のような使い方をしている場合にstaticcheckから誤った警告が出ます。
a := func() int { return 1 }()
b := new(a) // ← staticcheckは「aは使われていない」と誤検知する
go fix による書き換え自体は正しいのに、CIでstaticcheckが通らなくなるという状況に陥ります。
現時点での回避策としては //nolint:staticcheck を付与してチェックを抑制する方法があります。
a := func() int { return 1 }() //nolint:staticcheck
b := new(a)
こちらもすでにissueが上がっているので、修正を待つという選択肢もあります。
追記(2026/02/18): staticcheck v0.7.0で修正
上記のstaticcheckの誤検知はv0.7.0で修正されました。
staticcheck v0.7.0を取り込んだgolangci-lint v2.10.0がリリースされました。
3. VSCodeユーザーはgoplsの更新が必要
Go1.26で拡張された new 関数は式を引数として受け取れるようになりましたが、VSCodeで古いgoplsを使っている場合、「xxx is not a type」という趣旨のエラーメッセージが表示されます。 go fix で書き換えた直後にエディタが真っ赤になって焦るかもしれません。
goplsを更新することで解決できます。
-
Cmd+Shift+PでCommand Plateを呼び出して「Go: Install/Update Tools」を選択
go fix を実行する前に、まず開発環境のツール類を更新しておくことをおすすめします。
まとめ
Go1.26の go fix コマンドはコードベースを一括でモダナイズしてくれる非常に便利なツールですが、実際にプロダクションコードに適用してみると周辺ツールが追いついていない部分がありました。
| 困ったこと | 原因 | 対処法 |
|---|---|---|
| ジェネリクスのポインタ変換関数が置換されないケースがある |
go fix が未対応 |
手動で置換 |
| staticcheckの誤検知 | SA4006が new(値) を未認識 |
//nolint:staticcheck で抑制 |
これから go fix を適用しようとしている方の参考になれば幸いです。


