> Source: https://www.ymotongpoo.com/works/goblog-ja/go1.22/


# Go 1.22 がリリースされました！

[Go 1.22 is released!](https://go.dev/blog/go1.22) by Eli Bendersky, on behalf of the Go team

本日、Goチームは喜びとともにGo 1.22をリリースします。[ダウンロードページ](https://go.dev/dl/)から入手できます。

Go 1.22にはいくつかの重要な新機能と改善が含まれています。ここでは注目すべき変更の一部を紹介します。変更点の全リストについては[リリースノート](https://go.dev/doc/go1.22)を参照してください。

## 言語の変更

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

```go
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
    }
}
```

この変更や、コードが意図せず壊れることを防ぐツールについて詳しくは、以前公開した[ループ変数に関するブログ記事](https://go.dev/blog/loopvar-preview)を参照してください。

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

```go
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を含む)の範囲になります。詳細については[言語仕様](https://go.dev/ref/spec#For_range)を参照してください。

## パフォーマンスの改善

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

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

## 標準ライブラリへの追加

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

* [net/http.ServeMux](https://go.dev/pkg/net/http#ServeMux)で使われるパターンが、メソッドとワイルドカードを受け付けるようになりました。

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

* [database/sql](https://go.dev/pkg/database/sql)に新しい `Null[T]` 型が追加され、NULLを許容するカラムをスキャンする方法が提供されました。

* [slices](https://go.dev/pkg/slices)パッケージに、任意の型の複数のスライスを連結する `Concat` 関数が追加されました。

---

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

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

By Eli Bendersky, on behalf of the Go team

