1 ポイント 投稿者 GN⁺ 2024-02-08 | 1件のコメント | WhatsAppで共有
  • Go 1.22 は、Go 1.21 の6か月後にリリースされた。
  • 変更の大半は、ツールチェーン、ランタイム、ライブラリの実装にある。
  • Go 1 の互換性の約束は維持されており、ほぼすべての Go プログラムはこれまで通りコンパイルおよび実行できると見込まれる。

言語の変更点

  • for ループには2つの変更がある。
    • これまで for ループで宣言された変数は1回だけ生成され、各反復で更新されていたが、Go 1.22 ではループの各反復ごとに新しい変数が生成されるため、意図せず共有してしまうバグを防げる。
    • for ループで整数に対して範囲指定できるようになった。

ツール

Go コマンド

  • ワークスペースで vendor ディレクトリを使って依存関係を管理できる。
  • go get は、モジュールではない従来の GOPATH モードでは今後サポートされない。
  • go mod init は、他の vendoring ツールの設定ファイルからモジュール要件を取り込もうとしなくなった。
  • go test -cover は、自前のテストファイルを持たないパッケージについてもカバレッジの要約を出力するようになった。

Trace

  • trace ツールの Web UI は、新しいトレーサーをサポートするために一部再設計された。

Vet

  • ループ変数に対する vet ツールの動作が変更された。
  • append に値を追加していない呼び出しに対する新しい警告が追加された。
  • time.Sincedefer 文で使う際に起きる問題に対する新しい警告が追加された。
  • log/slog 呼び出しでキーと値の組が一致しない場合の新しい警告が追加された。

ランタイム

  • 型ベースのガベージコレクション用メタデータをヒープオブジェクトの近くに保持することで、CPU 性能が 1〜3% 向上した。

コンパイラ

  • プロファイルガイド最適化(PGO)ビルドで、以前より多くの呼び出しをデバーチャライズできるようになった。

リンカ

  • リンカの -s および -w フラグが、すべてのプラットフォームでより一貫して動作するように変更された。

ブートストラップ

  • Go 1.22 は、ブートストラップのために Go 1.20 の最終ポイントリリース以降を必要とする。

コアライブラリ

新しい math/rand/v2 パッケージ

  • math/rand/v2 は標準ライブラリ初の「v2」パッケージであり、math/rand と比べていくつかの重要な変更がある。

新しい go/version パッケージ

  • Go のバージョン文字列を検証・比較する関数を実装した新しい go/version パッケージが追加された。

強化されたルーティングパターン

  • 標準ライブラリの HTTP ルーティングが、より表現力豊かになるよう改善された。

ライブラリの細かな変更点

  • さまざまなライブラリに細かな変更と性能向上がある。

ポート

Darwin

  • macOS の 64 ビット x86 アーキテクチャ(darwin/amd64 ポート)では、Go ツールチェーンがデフォルトで位置独立実行ファイル(PIE)を生成するようになった。

Arm

  • GOARM 環境変数を使って、ソフトウェア浮動小数点またはハードウェア浮動小数点を選択できる。

Loong64

  • loong64 ポートでは、関数の引数と戻り値をレジスタで受け渡しするようになった。

OpenBSD

  • OpenBSD において、ビッグエンディアン 64 ビット PowerPC(openbsd/ppc64)向けの実験的ポートが追加された。

GN⁺ の見解

  • 今回の Go 1.22 リリースでは、特に for ループの変更点と新しい math/rand/v2 パッケージの導入が注目に値する。これらの変更は Go 開発者により良い性能と安定性をもたらし、新機能は Go 言語の進化を反映している。
  • math/rand/v2 パッケージは、より高速なアルゴリズムと新しい API により、より優れた乱数生成機能を提供する。これは暗号化やその他の乱数依存アプリケーションにとって重要な改善である。
  • Go 1.22 は、互換性を維持しつつ性能と開発者体験を向上させるさまざまな最適化と新機能を提供することで、Go コミュニティに前向きな影響を与えると期待される。

1件のコメント

 
GN⁺ 2024-02-08
Hacker Newsの意見
  • TypeScript開発者が最近Go言語へ移行した経験を共有。最初はGoの配列関数の少なさや柔軟性に欠ける型システムを懸念していたが、使っていくうちに標準ライブラリの優秀さ、型安全性、組み込みのコーディング標準の利点を実感した。ルーティングが標準ライブラリに統合された点も好意的に評価している。
  • Go 1.22向けのインタラクティブなリリースノートを提供するリンクを共有。
  • 9年以上Goを使っている開発者がDart(Flutter開発のため)とGoを比較。Dartは可能な限りあらゆる機能を追加しようとする一方、Goは逆にシンプルさを追求しているという。Dartではクラス初期化の方法が多様化して混乱しやすく、Goのシンプルさが恋しくなるとのこと。Dartのmap/streamなどを使った複雑な単一式は、デバッグ時や初心者にとって混乱の原因になり得る。
  • io.CopyがTCPConnからUnixConnへコピーする際に、Linuxのsplice(2)システムコールを使えるようになった。ioパッケージにおけるこの種のパターンから得られる利点を高く評価している。
  • Go 1.22ではルーティングパターンが改善されたが、その影響で軽微な互換性問題が発生する可能性がある。これはhttpmuxgo121フィールドで制御できる。
  • ある開発者は、Go言語に追加された「関数スコープ」機能を好ましく思っていない。この機能は、言語に追加された複雑さに見合うほどの利便性を提供しておらず、Goの明示的でシンプルなスタイルにも合わないと考えている。
  • Go 1.22で、ループの各反復ごとに新しい変数が生成されることに関する議論へのリンクを共有。
  • sql.Null[T]の追加を歓迎。従来はsqlboilernullを使っていたが、sql.Nullに似たAPIを持ち、さらに値が明示的に設定されたかどうかを示すIsSet() boolメソッドがある。
  • 標準ライブラリにルーティングが追加されたことを歓迎しており、chiライブラリを削除できるか検討中。
  • Goを本番環境で使っている開発者の間では、新バージョンへ素早く移行するのか、それとも古いリリースに留まるのかという疑問がある。anyキーワードの使用についての意見も交わされている。