本文へスキップ

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

出典

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

関連記事

「Python 3.15.1, 3.14.9 and 3.13.17 are out」と題したPython Insiderの記事。ダウンロードリンクと、pip 26.2.2とcertifi 2026.10.19についての説明が見えます。
プログラミング

Python 3.15.1、3.14.9、3.13.17がpip 26.2.2を同梱

Python 3.15.1、3.14.9、3.13.17が2026年10月21日に公開されました。pip(ピップ)26.2.2とcertifi 2026.10.19を同梱し、認証局eMudhraを信頼しないようにします。

2026年10月21日のphp.netのトップページ。PHPのロゴの下に、8.5.12、8.4.27、8.3.36、8.2.35の各リリースへのリンクが並んでいます。
プログラミング

PHP 8.5.12と8.4.27、重大なRCE脆弱性2件を修正

PHPは10月21日に8.5.12、8.4.27、8.3.36、8.2.35を公開し、9.2と評価されたリモートコード実行(RCE)の脆弱性2件を修正しました。PHPは、更新だけが完全な対策だとしています。