Skip to content
Tech AI Wire

Go 1.27、ジェネリックメソッドと高速なencoding/jsonを追加

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

著者 Tech AI Wire Team

4 分で読めます

A terminal showing go version reporting go1.27 on darwin/arm64, beside a Go method declaration that carries its own type parameter.

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の速度ほぼ同等
formatunknownタグ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つ確認があります。コンパイラがクロージャに対してより単純な名前を生成するようになったため、シンボル名を検査するテストは修正が要るかもしれません。関数ポインタを等値比較するコードはもともと誤りでしたが、このリリースではその誤りがより表に出ます。

出典

  1. Go 1.27 is released - The Go Blog
  2. Go 1.27 Release Notes - go.dev

関連記事

A terminal running benchcmp to compare a scalar Go benchmark against a vectorised one, with the delta column showing the speed-up.
Coding

Debian Code Search、最後のcgo依存を削除

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