Goブログ

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

Goチームを代表して、Eli Bendersky
2024年2月6日

本日、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
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

この変更と、コードが誤って壊れるのを防ぐツールについては、以前のループ変数に関するブログ記事を参照してください。

2つ目の言語変更は、整数範囲のサポートです。

package main

import "fmt"

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

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

パフォーマンスの向上

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

Go 1.21では、プロファイルガイド最適化(PGO)を搭載しましたが、この機能は引き続き改善されています。1.22で追加された最適化の1つは、改善されたデバーチャライゼーションであり、より多くのインターフェイスメソッド呼び出しの静的ディスパッチを可能にします。ほとんどのプログラムでは、PGOを有効にすると2〜14%の改善が見られます。

標準ライブラリの追加

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

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

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

  • database/sqlの新しいNull[T]型は、nullableな列をスキャンする方法を提供します。

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


コードとドキュメントの作成、バグの報告、フィードバックの共有、リリース候補のテストを通じて、このリリースに貢献してくださったすべての方々に感謝します。皆様のご尽力のおかげで、Go 1.22は可能な限り安定したものになりました。いつものように、問題に気付いた場合は、問題を報告してください

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

次の記事:Go 1.22のルーティング機能の強化
前の記事:Goでの開発に関するフィードバックをお聞かせください
ブログインデックス