Go 1.27 リリース

Go 1.27 is released by Nicholas Husin, on behalf of the Go team

本日Goチームは、Go 1.27をリリースしました。バイナリアーカイブとインストーラーは ダウンロードページ から入手できます。

Go 1.27では、言語、ツールチェイン、ランタイム、標準ライブラリにわたって大きな改良が加えられています。 以下ではその主なハイライトを紹介します。

言語の変更

Go 1.27では 言語仕様 に3つの注目すべき更新が加えられています。

まず、ジェネリックメソッドがサポートされるようになりました。例えば math/rand/v2.Rand を見てみましょう。

// Go 1.27より前は、型ごとに別々のメソッドをRandに追加する必要がありました
// (符号なし整数用のメソッドは簡潔にするため省略しています)。
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int

// Go 1.27では、すべての整数型に対して動作する新しいジェネリックメソッドが追加されました。
func (r *Rand) N[Int intType](n Int) Int

次に、 構造体リテラル 内のキーとして、その構造体型の 任意の有効な フィールドセレクタ を使えるようになり、ネストした構造体や 埋め込み構造体内のフィールドを直接初期化できるようになりました。

type Habitat struct {
    Burrow string
}

type Gopher struct {
    Name    string
    Habitat // 埋め込み構造体。
}

// Go 1.27ではBurrowを直接キーとして使えます。
g := Gopher{
    Name:   "Gopher",
    Burrow: "Burrow #42",
}

最後に、関数の型推論がすべての代入コンテキストに適用されるよう一般化されました。ジェネリック関数を、 複合リテラル、型変換、チャネル送信の中で、明示的な型引数なしに使えるようになりました。

func GenericFormatter[T any](v T) string {
    return fmt.Sprintf("value: %v", v)
}

type IntFormatter func(int) string

// Go 1.27では複合リテラル、型変換、チャネル送信においてT = intが推論されます。
formatters := []IntFormatter{GenericFormatter}
fn := IntFormatter(GenericFormatter)
ch := make(chan IntFormatter, 1)
ch <- GenericFormatter

ツールの改善

  • go fix には新たに複数の モダナイザー、すなわち atomictypesembedlitslicesbackwardunsafefuncs が追加されました。
  • go doc は、go doc example.com/pkg@v1.2.3 のような package@version 形式のクエリをサポートするようになりました。
  • go mod tidy は、go.mod 内にある複数の require ブロックを、 標準的な直接依存と間接依存の2ブロック構成に自動的に統合するようになりました。

パフォーマンスとランタイム

  • サイズ特化型のメモリアロケーション により、 小さいオブジェクト(80バイト未満)のアロケーションコストが最大30%削減され、アロケーションが 多いプログラム全体のパフォーマンスが約1%向上します。
  • runtime/pprofgoroutineleak プロファイルが正式版となり、 永続的にブロックされているゴルーチンを自動的に検出できるようになりました。

標準ライブラリの追加

  • encoding/json/v2 は、設定可能なオプションとより厳格な デフォルト動作を備えた高レベルのJSON処理を提供し、あわせて低レベルのストリーミング処理向けに encoding/json/jsontext も提供します。既存の encoding/json パッケージは、後方互換性を保ちながら より高速なアンマーシャリングを実現するため、内部でv2実装を利用するようになりました。
  • crypto/mldsa は、耐量子計算機暗号のML-DSA署名方式 (FIPS 204)を実装しており、 crypto/x509crypto/tls に統合されています。
  • uuid は、UUIDの生成とパースをネイティブにサポートします。
  • simd とアーキテクチャ固有の simd/archsimd は、実験的なSIMDサポートを提供します。
  • net/http/httptest には NewTestServer が追加され、 testing/synctest パッケージと組み合わせて使うのに適した インメモリの疑似ネットワークを提供します。

変更点の完全な一覧と詳細については、 Go 1.27リリースノート を お読みください。

今後数週間にわたって、Go 1.27に関連するトピックのいくつかをより詳しく扱ったブログ記事が 続きます。ぜひまた読みに来てください。

コードを書き、バグを報告し、実験的な追加機能を試し、リリース候補をテストすることでこのリリースに 貢献してくださったすべての方に感謝します。いつものように、何か問題に気づいた場合は issueを立てて ください。

Go 1.27を楽しんでお使いください!

By Nicholas Husin, on behalf of the Go team