2026年2月、Go 1.26がリリースされました🎉
今回のリリースでは、言語仕様の改善、パフォーマンスの大幅な向上、そして開発者体験を向上させる多くの新機能が追加されているなと全体的にみて思いました。
ここでは、Go 1.26の主要な変更点を紹介しようと思います。
言語仕様の変更
new関数が初期値を受け取れるように
Go 1.26から、new関数がオペランドとして式を受け取り、変数の初期値を指定できるようになりました。
従来の書き方:
type Person struct {
Name string `json:"name"`
Age *int `json:"age"`
}
func personJSON(name string, born time.Time) ([]byte, error) {
age := yearsSince(born)
return json.Marshal(Person{
Name: name,
Age: &age,
})
}
Go 1.26の書き方:
func personJSON(name string, born time.Time) ([]byte, error) {
return json.Marshal(Person{
Name: name,
Age: new(yearsSince(born)), // 初期値を直接指定
})
}
func yearsSince(t time.Time) int {
return int(time.Since(t).Hours() / (365.25 * 24))
}
特にJSON や Protocol Buffers などのシリアライゼーションパッケージでOptionalフィールド(ポインタで表現)を扱う際に便利なのではないでしょうか?
ジェネリクスの自己参照型が可能に
型パラメータリストで自分自身を参照できるようになり、より強力な型制約が可能になりました。
type Adder[A Adder[A]] interface {
Add(A) A
}
func algo[A Adder[A]](x, y A) A {
return x.Add(y)
}
以前はこのような自己参照は許可されていませんでしたが、Go 1.26で制限が解除されました。
ツールの改善
go fixコマンドの完全リニューアル
go fixコマンドが書き直され、GoのModernizrのホームとなりました。これにより、コードベースを最新のイディオムやAPIに自動的に更新できるようになります。
主な機能:
- 最新のGo言語機能とライブラリに対応した多数のフィクサー
- ソースレベルのインライナー(
//go:fix inlineディレクティブでAPIマイグレーションを自動化) -
go vetと同じGo解析フレームワークを使用
go mod initのデフォルトGoバージョン変更
go mod initが新しいgo.modファイルで指定するGoバージョンが変更されました。
- Go 1.26で実行 →
go 1.25.0を指定 - Go 1.26のリリース候補版で実行 →
go 1.24.0を指定
これにより、現在サポートされているGoバージョンとの互換性があるモジュールの作成が推奨されます。
cmd/docの削除
cmd/docとgo tool docが削除されました。
今後使用する場合はgo docを使用することになります(同じフラグと引数、同じ動作を持ちます)。
ランタイムの改善
新しいGreen Teaガベージコレクタがデフォルトに
Go 1.25で実験的に導入されたGreen Teaガベージコレクタが、フィードバックを反映してデフォルトで有効になりました。
従来のGCとの違い
Green Teaガベージコレクタは、特に小さなオブジェクトの処理において大幅な改善を実現しています。
パフォーマンス改善の仕組み:
従来のGC: オブジェクトA → [メモリの別領域] → オブジェクトB → [メモリの別領域] → オブジェクトC
↓ キャッシュミス発生 ↓ キャッシュミス発生
遅い... 遅い...
Green Tea GC: [オブジェクトA][オブジェクトB][オブジェクトC] ← 連続配置
↓ キャッシュヒット!
速い! + ベクトル命令でまとめて処理
無効化したい場合:
GOEXPERIMENT=nogreenteagc go build
cgo呼び出しの高速化
cgo呼び出しのベースラインランタイムオーバーヘッドが約30%削減されました。
ヒープベースアドレスのランダム化
64ビットプラットフォームで、起動時にヒープベースアドレスがランダム化されるようになりました。これはセキュリティ強化の一環で、cgo使用時の脆弱性悪用を困難にします。
実験的なゴルーチンリークプロファイル
新しいプロファイルタイプgoroutineleakが実験的に追加されました。
有効化方法:
GOEXPERIMENT=goroutineleakprofile go build
リークの検出例:
type result struct {
res workResult
err error
}
func processWorkItems(ws []workItem) ([]workResult, error) {
ch := make(chan result) // バッファなしチャネル
for _, w := range ws {
go func() {
res, err := processWorkItem(w)
ch <- result{res, err}
}()
}
var results []workResult
for range len(ws) {
r := <-ch
if r.err != nil {
// ここで早期リターンすると、残りのゴルーチンがリーク
return nil, r.err
}
results = append(results, r.res)
}
return results, nil
}
chがバッファなしのため、エラーで早期リターンすると残りのprocessWorkItemゴルーチンがリークします。このようなリークをランタイムが検出して報告します。
HTTPエンドポイントとしても利用可能:
/debug/pprof/goroutineleak
標準ライブラリの新機能
新パッケージ: crypto/hpke
RFC 9180で規定されたハイブリッド公開鍵暗号(HPKE)を実装する新しいパッケージが追加されました。ポスト量子ハイブリッドKEMもサポートしています。
実験的な新パッケージ: simd/archsimd
アーキテクチャ固有のSIMD操作へのアクセスを提供する実験的なパッケージです(現在はamd64のみ)。
有効化方法:
GOEXPERIMENT=simd go build
対応するベクトル型:
-
Int8x16,Float64x8など(128ビット、256ビット、512ビット) -
Int8x16.Addなどの操作
実験的な新パッケージ: runtime/secret
暗号情報を扱うコードで使用される一時データを安全に消去する機能を提供します。
GOEXPERIMENT=runtimesecret go build
現在、Linux上のamd64とarm64アーキテクチャをサポートしています。
注目のライブラリ改善
bytes.Buffer.Peekメソッド
バッファから次のnバイトを取得するが、バッファは進めない新しいメソッド。
buf := bytes.NewBufferString("Hello, World!")
peek := buf.Peek(5) // "Hello"を取得するがバッファは進まない
errors.AsType関数
型安全で高速なAsのジェネリック版が追加されました。
// 従来
var pathErr *fs.PathError
if errors.As(err, &pathErr) {
// pathErrを使用
}
// Go 1.26
if pathErr := errors.AsType[*fs.PathError](err); pathErr != nil {
// pathErrを使用
}
io.ReadAllの最適化
中間メモリの割り当てが削減され、最小サイズの最終スライスを返すようになりました。
- 約2倍高速
- 通常、総メモリ割り当てが約半分
log/slog.NewMultiHandler
複数のハンドラを呼び出すMultiHandlerを作成できるようになりました。
handler := slog.NewMultiHandler(
slog.NewJSONHandler(os.Stdout, nil),
fileHandler,
remoteHandler,
)
net/httpの改善
-
HTTP2Config.StrictMaxConcurrentRequests: ストリーム制限を超えた場合の新しい接続開設を制御 -
Transport.NewClientConn: HTTPサーバーへのクライアント接続を返す - Cookieのスコープが
Request.Hostに基づくように改善
testingパッケージの新機能
ArtifactDirメソッド
テスト出力ファイルを書き込むディレクトリを返します。
func TestArtifacts(t *testing.T) {
dir := t.ArtifactDir()
// dirにアーティファクトを書き込む
}
使用方法:
go test -artifacts -outputdir=./output
B.Loopの最適化
ループボディでのインライン化を妨げなくなり、より正確なベンチマーク結果が得られるようになりました。
timeパッケージ
asynctimerchan GODEBUGの設定がGo 1.27で削除される予定です。Go 1.27以降、タイマーは常にバッファなし(同期)チャネルを使用します。
プラットフォームサポート
macOS
- Go 1.26はmacOS 12 Montereyで実行できる最後のリリース
- Go 1.27はmacOS 13 Ventura以降が必要
Windows
- 32ビット windows/armポートが削除されました
RISC-V
- linux/riscv64でレースディテクタがサポートされるようになりました
WebAssembly
- サインエクステンションと非トラップ浮動小数点から整数への変換命令が無条件で使用されるように
- 16MiB未満のヒープを持つアプリケーションでメモリ使用量が大幅に削減
Go 1.26は、パフォーマンス、開発者体験、セキュリティの各面で大きな改善をもたらすリリースでした!
ぜひ1.26を試しに触ってみてください!