🚧Experimental Warning
本稿では安定機能と実験機能(GOEXPERIMENT)をあわせて取り上げます。安定(Go 1.25で標準):
testing/synctest
,runtime/trace.FlightRecorder
実験(GOEXPERIMENT):greenteagc
,encoding/json/v2
実験的機能は後方互換が保証されません。本番適用は自己責任で。最新の公式ドキュメントをご確認ください。
今回のリリースはコンテナ環境の最適化、軽量トレース(Flight Recorder)、GCの実験的改善、並行処理テストの標準化が大きな柱です。 本記事ではGoForceが選んだ注目機能トップ5と、今すぐ確認すべき重要変更点を速報でお届けします。
🆕新挙動(要点)
- デフォルトの
GOMAXPROCS
が、Linuxでは cgroup のCPU帯域制限(quota) を考慮。- 一定間隔で自動更新(論理CPU数・CPUアフィニティ・cgroup CPU帯域の変更を反映)。
- いずれも手動設定(環境変数
GOMAXPROCS
やruntime.GOMAXPROCS
呼び出し)時は無効化。GODEBUG=containermaxprocs=0
/updatemaxprocs=0
で明示無効化も可能。
これは何か?
Go 1.25から、GOMAXPROCS
のデフォルト決定に cgroupのCPU帯域制限(quota/period) と CPUアフィニティ が取り込まれ、Linuxコンテナ(Kubernetes等)でのスレッド並列度が実環境により近い値へ自動設定・自動更新されます。
Go 1.24以前との差分比較
text1Go 1.24以前 vs Go 1.25 2 3項目 | Go 1.24以前(従来) | Go 1.25(確定) 4------------------|-------------------------------------|------------------------------- 5初期値 | 論理CPU数(`runtime.NumCPU()`) | **cgroup CPU帯域**・**CPUアフィニティ**も考慮 6自動更新 | なし | **定期的に更新**(論理CPU/アフィニティ/帯域変化) 7手動設定の優先 | ― | 手動設定で**自動更新を無効化** 8無効化フラグ | ― | `GODEBUG=containermaxprocs=0` / `updatemaxprocs=0` 9対象OS | 全OS(cgroup非考慮、定期更新なし) | ** Linuxでcgroup帯域を考慮 ** 全OSで定期的に自動更新(手動設定・GODEBUGで無効化可)
補足:Linuxではcgroup v1/v2の双方に対応(混在構成も可)。詳細設計は提案Issueにまとまっています
go1// 明示的に無効化する場合(=0 を忘れずに) 2 // GODEBUG=containermaxprocs=0 または updatemaxprocs=0 3 4 // 以前にGOMAXPROCSを手動設定していたが、 5 // 1.25の新デフォルトに戻したい場合 6 runtime.SetDefaultGOMAXPROCS()
特にKubernetesでのマイクロサービス運用において、リソース効率とパフォーマンスの両立が格段に簡単になります。
🔬実験的機能について
greenteagcは GOEXPERIMENT=greenteagc で有効化できる実験的GCです(1.25時点)。今後仕様や効果は変わる可能性があります。
これは何か?
提案中の新しい実験的なガベージコレクタで、将来的にGOEXPERIMENT=greenteagc
で有効化できる可能性があります。
何が期待されるか? Mark/Sweepでの局所性・スケール性改善により、GCオーバーヘッドが概ね10–40%減になることが期待されています(ワークロード依存)。:
技術的観点(概要)
bash1# 実験的機能の有効化 2GOEXPERIMENT=greenteagc go build -o myapp main.go
メモリ集約的なアプリケーションや、大量の短命オブジェクトを扱うWebサーバーでの性能向上が見込まれます。今後の正式採用が非常に楽しみな機能です。
testing/synctest
パッケージ(Go 1.25で標準追加):並行処理テストの革新🎉1.25で標準入り
1.24ではGOEXPERIMENT=synctest
の実験として提供されていましたが、1.25で一般提供になりました(APIは若干変更、旧APIは1.26で削除予定)。
これは何か? 並行処理コードを隔離された“バブル”内でテストでき、時間が仮想化されます。すべてのgoroutineがブロック状態になると、時計が瞬時に進むため、タイマー依存のテストを決定的に書けます。
何が期待されるか?
time.Sleep
に頼らない非Flakyなテスト。
制限事項(抜粋)
go1func TestTimeout(t *testing.T) { 2 synctest.Test(t, func(t *testing.T) { 3 // バブル内では time は仮想化され、全goroutineがブロックすると即座に進む 4 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 5 defer cancel() 6 <-ctx.Done() // 仮想時間で即終了 7 synctest.Wait() // バブル内がブロックするまで進める 8 }) 9}
既存ワークフローとの組み合わせ例:
bash1# ベンチマークテストとの組み合わせ 2go test -run=^$ -bench=. -benchtime=1s ./...
⚠️API変更について:synctest.Run
は非推奨で1.26で削除予定です。synctest.Test
とsynctest.Wait
の使用を推奨します。
🔬実験的機能について
Go 1.25では GOEXPERIMENT=jsonv2 を有効にすると、encoding/json/v2とencoding/json/jsontextが利用可能になります。また同時に 既存のencoding/jsonが新実装を内部使用します(APIは互換、エラーメッセージ文言などは変わる場合あり)。
これは何か? 新しいJSON実装群です。encoding/json/v2は高水準API、encoding/json/jsontextは低水準のトークナイザ/エンコーダAPIを提供します。
何が期待されるか? 特にデコード(Unmarshal)性能の大幅向上が期待されます。ベンチ結果ではケースにより2.3–5.7x(interface系)、5.6–12x(RawValue系)など大きな差が報告されています(詳細は下記リポジトリ参照)。
bash1GOEXPERIMENT=jsonv2 go test ./...
ベンチ参照:go-json-experiment/jsonbench(相対性能チャート多数)
⚠️注意:実験段階のため、挙動やエラーテキスト、オプションは今後変更される可能性があります。
🎉1.25で標準入り
Flight RecorderはGo 1.25で安定機能として追加されました。同時に有効化できるFlight Recorderは1つのみですが、通常のトレース(trace.Start
)との併用は可能です。
これは何か? これまでオーバーヘッドが大きく本番投入が難しかった実行トレースを、問題発生時の数秒間だけスナップショットとして保存できる機能です。
何が期待されるか? 再現性の低い本番環境でのみ発生するパフォーマンス問題のデバッグが、現実的なものになります。
go1// 正しい例(Go 1.25) 2fr := trace.NewFlightRecorder(trace.FlightRecorderConfig{ 3 // バッファ容量などを必要に応じ設定 4}) 5if err := fr.Start(); err != nil { panic(err) } 6defer fr.Stop() 7 8// 事象発生時に直近数秒のトレースをファイルへスナップショット 9f, _ := os.Create("trace.out") 10defer f.Close() 11if _, err := fr.WriteTo(f); err != nil { panic(err) }
nil
ポインタチェックのバグ修正:あなたのコードはパニックするかも?📋修正予定について
この修正は Go issue #72860 で追跡されている問題の解決として検討されています。
Go 1.21から存在するnil
チェックを遅延させてしまうコンパイラのバグの修正が検討されています。エラーチェックの前にnil
レシーバのメソッドを呼び出すような不正なコードは、正しくパニックするようになる予定のため、心当たりのあるコードは修正が必要になる可能性があります。
go1// ❌ 問題のあるコード(Go 1.25でパニック) 2var ptr *MyStruct 3result := ptr.Method() // ここでパニック発生 4if result.Error != nil { 5 // このチェックに到達しない 6}
go1// ✅Go 1.25以降も安全なコード 2var ptr *MyStruct 3if ptr != nil { 4 result := ptr.Method() 5 if result.Error != nil { 6 // 安全にエラーハンドリング 7 } 8}
bash1# nil ポインタ問題の検出(synctestとは独立) 2go test -run=TestNilPanic -race ./... 3 4# go vet: 標準のアナライザ 5go vet ./... 6 7# nilness アナライザを明示的に走らせる(要インストール) 8go install golang.org/x/tools/go/analysis/passes/nilness/cmd/nilness@latest 9go vet -vettool="$(which nilness)" ./...
go vet
の新アナライザ追加:より安全なコードへsync.WaitGroup.Add
の間違った呼び出しを検出するwaitgroup
と、IPv6非対応のホスト・ポート文字列結合を検出するhostport
が追加されました。CIでgo vet
を回している場合は要チェックです。
go1// 検出される問題例 2var wg sync.WaitGroup 3go func() { 4 wg.Add(1) // ゴルーチン内でのAdd呼び出しを検出 5 defer wg.Done() 6}() 7 8// IPv6アドレスの不正な結合も検出 9addr := host + ":" + port // IPv6の場合は[host]:portが正しい
Go 1.25での開発には、macOS12以降が必要になる予定です。古い環境の開発者はアップデートが必要になる可能性があります。
参考: Go Release Policy (リリース要件詳細)
Go 1.25への移行を検討する際に、既存コードへの影響を最小限に抑えるため、以下の点をご確認ください:
nil
ポインタチェック:Go 1.21以降のバグが修正されたため、不正なnil
レシーバ呼び出しが正しくパニックするようにgo vet
の新アナライザ(waitgroup
、hostport
)による警告増加の可能性bash1# Go 1.25安定版のインストール 2go install golang.org/dl/go1.25@latest 3go1.25 download 4 5# 実験的機能を含むテスト 6GOEXPERIMENT=greenteagc,jsonv2 go1.25 test ./... 7 8# 互換性チェック 9go1.25 vet ./...
greenteagc
、jsonv2
)の検証makefile1# Go 1.25実験的機能を一括テスト 2GOEXPERIMENT?=greenteagc,jsonv2 3 4test: 5 GOEXPERIMENT=$(GOEXPERIMENT) go test ./... 6 7bench: 8 GOEXPERIMENT=$(GOEXPERIMENT) go test -run=^$ -bench=. ./... 9 10vet: 11 go vet ./... 12 13compatibility-check: 14 go test -run=TestNilPanic -race ./... 15 go vet -nilness ./...
社内 CI にそのまま貼り付けて動作検証できます。
Go 1.25のリリースは、コンテナ親和性の向上、GC改善、テスト容易性の向上など、現代的なアプリケーション開発を強力にサポートする非常に実践的な方向性で進められています。
特にnil
ポインタのバグ修正は、既存のコードに影響を与える可能性があるため、正式リリース後のアップグレード前に一度確認することをお勧めします。提案中の新機能については実験的機能も含めて積極的に検証し、将来の正式採用に備えることが重要です。
Go 1.25の最新開発状況については、Go DevelopmentやGo Proposalsをご確認ください。
今回の速報では紹介しきれなかった提案機能が、まだまだたくさんあります。次回は『パフォーマンス改善編』として、提案中の新GC greenteagc
のベンチマーク予想や、Flight Recorderの期待される使い方を深掘りします。
ご期待ください!
免責事項
本記事の内容は2025年8月13日時点の情報に基づいており、提案段階・実験段階の機能を含んでいます。正式リリース時には仕様や機能が変更される可能性があります。実装時は最新の公式ドキュメントをご確認ください。
私たちGoForceでは、Goの最新動向を常にキャッチアップし、スキルを磨き続けるプロフェッショナルなフリーランスエンジニアを応援しています。
✅ Go 1.25の新機能をいち早く実務で活かしたい
✅ 挑戦的なプロジェクトに興味がある
✅ 最新技術トレンドを追い続けたい
そんな方は、ぜひ一度私たちにご相談ください。
最適なGo案件を今すぐチェック!