Goブログ
Go 1.22 がリリースされました!
本日、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をお楽しみください!