Go 1.22 がリリースされました!

Go 1.22 is released! by Eli Bendersky, on behalf of the Go team

本日、Goチームは喜びとともにGo 1.22をリリースします。ダウンロードページから入手できます。

Go 1.22にはいくつかの重要な新機能と改善が含まれています。ここでは注目すべき変更の一部を紹介します。変更点の全リストについてはリリースノートを参照してください。

言語の変更

長年の課題であった、for文でイテレーションの間にループ変数が意図せず共有されてしまう問題が解消されました。Go 1.22からは、次のコードは「a」「b」「c」を何らかの順序で出力するようになります。

func main() {
    done := make(chan bool)

    values := []string{"a", "b", "c"}
    for _, v := range values {
        go func() {
            fmt.Println(v)
            done <- true
        }()
    }

    // すべてのゴルーチンが終了するのを待ってから終了する
    for _ = range values {
        <-done
    }
}

この変更や、コードが意図せず壊れることを防ぐツールについて詳しくは、以前公開したループ変数に関するブログ記事を参照してください。

2つ目の言語仕様の変更は、整数に対するrangeのサポートです。

package main

import "fmt"

func main() {
    for i := range 10 {
        fmt.Println(10 - i)
    }
    fmt.Println("go1.22 has lift-off!")
}

このカウントダウンプログラムにおける i の値は、0から9まで(9を含む)の範囲になります。詳細については言語仕様を参照してください。

パフォーマンスの改善

Goランタイムにおけるメモリの最適化によって、CPUパフォーマンスが1〜3%向上するとともに、ほとんどのGoプログラムのメモリオーバーヘッドが約1%削減されます。

Go 1.21では、Goコンパイラにプロファイルガイド最適化(PGO)を導入しましたが、この機能は引き続き改善が進められています。1.22で追加された最適化の一つが、インターフェースのメソッド呼び出しをより多く静的ディスパッチできるようにする、devirtualization(仮想化解除)の改善です。PGOを有効にすると、多くのプログラムで2〜14%の改善が見られます。

標準ライブラリへの追加

  • 新しいmath/rand/v2パッケージは、よりクリーンで一貫性のあるAPIを提供し、より高品質で高速な疑似乱数生成アルゴリズムを使用します。詳細はプロポーザルを参照してください。

  • net/http.ServeMuxで使われるパターンが、メソッドとワイルドカードを受け付けるようになりました。

    例えば、ルーターは GET /task/{id}/ のようなパターンを受け付けます。これは GET リクエストのみにマッチし、{id} セグメントの値を、Requestの値を通じてアクセスできるマップの中にキャプチャします。

  • database/sqlに新しい Null[T] 型が追加され、NULLを許容するカラムをスキャンする方法が提供されました。

  • slicesパッケージに、任意の型の複数のスライスを連結する Concat 関数が追加されました。


コードやドキュメントの作成、バグの報告、フィードバックの共有、リリース候補版のテストなど、今回のリリースに貢献してくださったすべての方々に感謝します。皆さんの尽力のおかげで、Go 1.22はできる限り安定したものになりました。いつものように、何か問題に気づいたらissueを作成してください

Go 1.22をお楽しみください!

By Eli Bendersky, on behalf of the Go team