Go 1.27、ジェネリックメソッドと高速なencoding/jsonを追加
Go 1.27が2026年8月19日にリリース。ジェネリックメソッド、encoding/json配下のv2エンジン、goroutineリークプロファイル(漏れ検出)、耐量子署名が入りました。
4 分で読めます

Go 1.27が2026年8月19日にリリースされ、言語そのものが変わりました。メソッドが自分の型パラメータを宣言できるようになりました。ジェネリクスの導入以来、Goが認めてこなかったことです。Nicholas Husin氏がGoチームを代表してGoブログで発表しました。
言語の変更よりも多くのプログラムに届く変更が、ほかに2つあります。標準のJSONパッケージが新しいエンジンで動くようになったことと、ランタイムがリークしたgoroutineを教えてくれるようになったことです。
ジェネリックメソッドと、唯一の制限
このリリースより前は、型はジェネリックにできても、そのメソッドが独自の型パラメータを追加することはできませんでした。そのため作者は、具体的な型ごとにメソッドを書いていました。
リリースノートはmath/rand/v2.Randを例に挙げています。そのメソッドはいま(*Rand) N[Int intType](Int) Intという形です。1つのメソッドがすべての整数型を賄います。
はっきりした制限もあります。インターフェースのメソッドは型パラメータを宣言できないため、ジェネリックメソッドでインターフェースのメソッドを実装することはできません。この線引きは意図的なもので、一時的な欠落ではありません。
小さな言語変更も2つ入りました。構造体リテラルのキーは「may now be any valid field selector for the struct type」となり、入れ子や埋め込みのフィールドを直接設定できます。また関数の型推論は「has been generalized to apply in all assignment contexts」となり、複合リテラル、型変換、チャネルへの送信も対象になりました。
encoding/jsonがv2で動くようになった
encoding/jsonパッケージは、v2の実装が土台になりました。v1のAPIは残ります。リリースノートは、v1が非推奨ではないと明記しています。移行は必要ありません。
一方で既定の挙動は厳しくなりました。動いていたコードが壊れうるのはここです。v2エンジンはJSON文字列中の不正なUTF-8を拒否します。JSONオブジェクト内の重複したキー名も拒否します。どちらも以前は通っていました。
| 変更 | 影響 |
|---|---|
| 文字列中の不正なUTF-8 | 拒否されるようになった |
| オブジェクトの重複キー | 拒否されるようになった |
| Unmarshalの速度 | 大幅に高速化 |
| Marshalの速度 | ほぼ同等 |
formatとunknownタグ | v2で削除 |
inlineタグオプション | embedに改名 |
何か壊れた場合は、ビルド時にGOEXPERIMENT=nojsonv2を指定すると以前の実装に戻せます。ただしこれは解決策ではなく期限だと考えてください。リリースノートは、この退避手段が将来のリリースで削除される見込みだと述べています。
新しいパッケージも2つ付いてきます。可変長のオプションを取るencoding/json/v2と、トークン単位で扱うためのencoding/json/jsontextです。
リークプロファイル、アロケーション、耐量子署名
goroutineリークプロファイルがruntime/pprofで一般提供になりました。Go 1.26では実験的でした。リークしたgoroutineとは「a goroutine blocked on some concurrency primitive (channels, sync.Mutex, sync.Cond, etc) that cannot possibly become unblocked」を指します。
ランタイムはガベージコレクタを使ってこれを見つけます。ブロックされたgoroutineが待っている対象に、実行可能などのgoroutineからも到達できないなら、それは二度と目覚めません。/debug/pprof/goroutineleakから取得します。既知の死角もあります。グローバル変数経由で到達できる対象でのリークは見逃されることがあります。
アロケーションは安くなりました。コンパイラがサイズ特化のアロケーション処理を呼ぶようになり、80バイト未満のアロケーションの費用を最大30%削減します。リリースノートは、アロケーションの多いコードでプログラム全体としては約1%の改善、バイナリは約60 KB増えるとしています。
セキュリティ担当者向けには、crypto/mldsaがFIPS 204の耐量子署名方式ML-DSAを実装しました。TLS 1.3にMLDSA44、MLDSA65、MLDSA87の署名方式が加わり、x509が鍵を扱います。
これが開発者にとって意味すること
アップグレード前に、削除された項目を読んでください。壊れるのはそこです。Go 1.27はmacOS 13 Ventura以降を要求します。バージョン管理システムbzrのサポートが外れ、bzrでホストされたモジュールは取得できなくなりました。
GODEBUGの退避手段がいくつか消え、そのうち1つは挙動を変えます。asynctimerchanが削除されたため、timeパッケージが作るチャネルは常にバッファなしになりました。バッファありの挙動を前提に書いたコードは、いま別の約束の上で動いています。
JSONの変更は、読むだけでなくステージング環境で通してください。厳しくなったパースは、いま受け入れているデータで失敗します。特に重複キーは、自分のテストではなく他人のシステムから届くものです。出荷前に、本番の実データを新しいビルドに通してください。
異常が見えていなくても、リークプロファイルは有効にしてください。無料で、安定版になり、恒久的にブロックされたgoroutineは自分のスタックとスタックが参照するすべてを抱えたままです。この種のバグはエラーとしてはめったに現れず、戻ってこないメモリとしてだけ現れます。
関数値で凝ったことをしている人には、最後にもう1つ確認があります。コンパイラがクロージャに対してより単純な名前を生成するようになったため、シンボル名を検査するテストは修正が要るかもしれません。関数ポインタを等値比較するコードはもともと誤りでしたが、このリリースではその誤りがより表に出ます。
出典
- Go 1.27 is released - The Go Blog
- Go 1.27 Release Notes - go.dev
関連記事

改ざんされたstripがNixOS全体にバックドアを仕込める
研究者が、Ken Thompsonのtrusting-trust攻撃をコンパイラではなくGNU stripで構成し、NixOSインストーラのほぼ全バイナリにバックドアを仕込みました。

LLVM、ClangIRを既定でビルドするか議論
ClangIRをClangに既定で組み込むRFCが出ました。使うにはフラグが必要ですが、ビルド時間が2倍以上になるという見積もりもあります。

Debian Code Search、最後のcgo依存を削除
Michael Stapelberg氏が7年前のCライブラリを、実験的なSIMDパッケージを使った純粋なGo実装に置き換え、C版と同等の速度に到達しました。