Go 1.24リリース:より速く、よりスマートに、よりベター – 大切なことすべてを知っておこう!
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Go 1.24リリースノートの概要
Go 1.24は、Go言語の開発における重要なバージョンイテレーションです。以前のバージョンとの互換性を維持しながら、多数の新機能、最適化、および改善点を包括的に導入し、大多数のGoプログラムのスムーズなコンパイルと動作を効果的に保証します。このアップデートは、開発者により強力なプログラミングツールを提供するだけでなく、Go言語のパフォーマンス、セキュリティ、およびユーザビリティを大幅に向上させます。
I. 言語の変更
Go 1.24は、ジェネリック型エイリアスを完全にサポートし、開発者は通常の型を定義するのと同じ方法で型エイリアスをパラメータ化できます。この機能は、コードの記述の柔軟性を大幅に拡大し、コードの再利用性と可読性を大幅に向上させます。
// ジェネリック型エイリアスを定義する type MyAlias[T int | string] = T func main() { var num MyAlias[int] = 10 var str MyAlias[string] = "Hello, Go 1.24!" }
現在、開発者はGOEXPERIMENT=noaliastypeparamsを設定することで、この機能を無効にできます。ただし、Go 1.25バージョンでは、aliastypeparams設定は正式に削除されることに注意してください。
II. ツール
Goコマンド
Goモジュールでは、toolディレクティブの導入により、go.modファイル内の実行可能ファイルの依存関係を追跡することがより便利になります。このアプローチは、以前のツールをブランクインポートとして「tools.go」ファイルに追加する慣行に代わるものです。go toolコマンドを使用すると、これらのカスタムツールを実行できるだけでなく、Goディストリビューションに含まれるさまざまなツールを実行することもできます。さらに、go getコマンドには新しい-toolフラグがあり、これは指定されたパッケージのtoolディレクティブを追加するために特別に使用されます。toolメタパターンは、go get tool、go install toolなど、モジュール内のすべてのツールを一括アップグレードまたはインストールするのに便利です。
ビルドおよびテストコマンドの機能強化
go runおよびgo toolによって作成された実行可能ファイルは、Goビルドキャッシュに自動的にキャッシュされるようになりました。この最適化により、繰り返しの実行が大幅に高速化されますが、それに応じてキャッシュスペースの占有量も増加します。go build、go install、およびgo testコマンドにはすべて新しい-jsonフラグがあり、構造化されたJSON形式でビルド結果とエラーメッセージを出力するために使用されます。go test -jsonの出力では、ビルドおよびテスト結果のJSONデータは、新しいActionタイプによって区別されます。テスト統合システムに問題がある場合は、開発者はGODEBUG=gotestjsonbuildtext=1を設定して、テキスト形式の出力を復元できます。
認証とバージョンの設定
さまざまなシナリオでプライベートモジュールを取得するための認証要件を満たすために、Go 1.24はGOAUTH環境変数を追加し、より柔軟な認証方法を提供します。go buildコマンドは、バージョン管理システムのタグまたはコミット情報に基づいて、コンパイルされたバイナリファイルのメインモジュールバージョンを設定します。コミットされていない変更がある場合、バージョン番号には自動的に+dirtyサフィックスが追加されます。開発者がバージョン管理情報を無視したい場合は、-buildvcs=falseフラグを使用できます。同時に、新しいGODEBUG設定toolchaintrace=1は、開発者がgoコマンドのツールチェーン選択プロセスを追跡するのに役立ちます。
Cgo
CgoはGo 1.24で新しい機能を取得し、ランタイムパフォーマンスを向上させるために新しいC関数の注釈をサポートしています。その中で、#cgo noescape cFunctionNameは、コンパイラにcFunctionnameに渡されるメモリがエスケープしないことを通知するために使用されます。#cgo nocallback cFunctionNameは、このC関数がGo関数をコールバックしないことを示します。さらに、CgoによるC関数の複数の互換性のない宣言の検査がより厳格になりました。異なるファイルに互換性のない宣言がある場合、エラーをよりタイムリーかつ正確に検出して報告できます。
Objdump
Objdumpツールは、Go 1.24でそのサポート範囲をさらに拡大しました。64ビットLoongArch(GOARCH=loong64)、RISC-V(GOARCH=riscv64)、およびS390X(GOARCH=s390x)アーキテクチャで逆アセンブル操作を実行できるようになりました。
Vet
Vetツールはtestsアナライザーを追加しました。これは、テストパッケージのテスト、ファズテスト、ベンチマーク、および例の宣言で発生する可能性のある一般的なエラーをチェックするために主に使用されます。たとえば、名前の形式が正しくない、署名が正しくない、またはexampleレコードに存在しない識別子などです。このアナライザーは、go testが実行されると自動的に実行されます。同時に、printfアナライザーは、fmt.Printf(s)(sは他のパラメータを持たない非定数形式の文字列です)の呼び出しを診断し、代わりにfmt.Printを使用することを提案します。buildtagアナライザーは、//go:buildディレクティブの無効なGoメジャーバージョンのビルド制約をチェックします。copylockアナライザーは、3句の「for」ループでsync.Locker(sync.Mutexなど)を含む変数の検出に焦点を当て、安全でないロックコピー操作を効果的に防止します。
GOCACHEPROG
cmd/go内のバイナリおよびテストのキャッシュメカニズムは、GOCACHEPROG環境変数を介して子プロセスによって実装できるようになりました。子プロセスはJSONプロトコルを介してcmd/goツールと対話し、開発者はキャッシュ関連の操作を処理する際に、より柔軟性とカスタマイズ性を提供します。
III. ランタイム
Go 1.24は、ランタイムで一連の効果的なパフォーマンス最適化を実行しました。一連の代表的なベンチマークテストで検証された結果、CPUオーバーヘッドが平均2〜3%削減されました。これらの最適化は主に、Swissテーブルに基づく新しい組み込みmapの実装、より効率的な小オブジェクトメモリ割り当て、および新しいランタイム内部mutexに反映されています。開発者が特別なニーズがあり、新しい組み込みmapの実装とランタイム内部mutexを無効にしたい場合は、それぞれGOEXPERIMENT=noswissmapおよびGOEXPERIMENT=nospinbitmutexを設定することで、ビルドプロセス中にこれを実現できます。
IV. コンパイラ
Go 1.24では、コンパイラはcgoによって生成された型の検査を強化しました。レシーバーがcgoによって生成された型を表す場合(直接的またはエイリアス型を介して間接的に)、コンパイラは常にエラーメッセージを報告します。これにより、開発者は開発プロセスの早い段階で潜在的な問題を発見して解決できます。
V. リンカ
ELFプラットフォームでは、リンカはデフォルトでGNUビルドID(つまり、ELF NT_GNU_BUILD_IDノート)を生成します。macOSプラットフォームでは、デフォルトでUUID(つまり、Mach-O LC_UUIDロードコマンド)を生成します。これらのIDの生成は、GoビルドIDから派生しています。開発者が特別なニーズがあり、この機能を無効にしたい場合は、-B noneフラグを使用できます。デフォルト設定をオーバーライドするためにユーザー定義の16進値を指定したい場合は、-B 0xNNNNフラグを使用できます。
VI. ブートストラップ
Go 1.24の構築は、Go 1.22.6以降のバージョンに依存してブートストラップする必要があります。計画どおり、Go 1.26バージョンでは、ブートストラップにGo 1.24以降のポイントリリースバージョンが必要になる予定です。
VII. 標準ライブラリ
ディレクトリ制限付きファイルシステムアクセス
os.Root型とos.OpenRoot関数の出現により、開発者は特定のディレクトリ内でファイルシステム操作を実行できるようになりました。このメカニズムを通じて、すべての操作が指定されたディレクトリ範囲内で厳密に制限されることが保証され、シンボリックリンクを介して外部ロケーションへのアクセスを効果的に防止し、ファイルシステム操作のセキュリティと制御性を向上させます。
package main import ( "fmt" "os" ) func main() { root, err := os.OpenRoot("/tmp") if err!= nil { fmt.Println("Error opening root:", err) return } defer root.Close() file, err := root.Create("test.txt") if err!= nil { fmt.Println("Error creating file:", err) return } defer file.Close() }
新しいベンチマーク機能
testing.B.Loopメソッドは、従来のb.Nベースのループ構造よりも効率的で、エラーが発生しにくいです。各-countがベンチマーク関数を1回だけ実行することを保証できます。これにより、コストのかかるセットアップとクリーンアップ手順の実行回数が減るだけでなく、関数呼び出しのパラメータと結果が有効に保たれ、コンパイラがループ本体に対して不要な最適化を実行するのを防ぎます。
package main import ( "testing" ) func BenchmarkExample(b *testing.B) { for b.Loop() { // Actual benchmark code } }
改善されたファイナライザー
runtime.AddCleanup関数は、runtime.SetFinalizerよりも柔軟で効率的で、エラーが発生しにくいです。開発者は、クリーンアップ関数をオブジェクトにアタッチできます。オブジェクトが到達不能になると、クリーンアップ関数が自動的に実行されます。この関数は、同じオブジェクトに複数のクリーンアップ関数をアタッチすることをサポートし、内部ポインタにアタッチすることもできます。オブジェクトが循環参照を形成する場合、runtime.AddCleanupは一般にメモリリークを引き起こさず、オブジェクトとそれが指すオブジェクトの解放を遅らせません。したがって、新しいコードを記述するときは、最初にruntime.AddCleanupを使用することをお勧めします。
新しいweakパッケージ
weakパッケージの導入により、開発者に弱いポインタが提供されます。これは、弱いマップ、正準マップ、およびさまざまなキャッシュなどの、メモリ効率の高い構造を作成する場合に非常に役立ちます。runtime.AddCleanupとmaphash.Comparableを組み合わせることで、これらのシナリオでの使用要件をより適切に満たし、プログラムのメモリ管理効率をさらに向上させることができます。
新しいcryptoパッケージ
crypto/mlkemパッケージは、2つのポスト量子鍵交換メカニズム、ML-KEM-768およびML-KEM-1024を正常に実装しました。crypto/hkdf、crypto/pbkdf2、およびcrypto/sha3パッケージは、それぞれ関連する鍵導出関数とハッシュ関数を実装しました。これらのパッケージの実装は、golang.org/x/crypto/...パッケージに基づいており、暗号化の分野でGo言語のアプリケーションのためのより多くのツールとサポートを提供します。
FIPS 140-3準拠
Go 1.24は、FIPS 140-3準拠を促進するための新しいメカニズムを導入しました。Go cryptoモジュールは、内部標準ライブラリパッケージのセットとして、FIPS 140-3承認済みアルゴリズムを透過的に実装できます。つまり、アプリケーションは変更なしにこれらの準拠アルゴリズムを直接使用できます。GOFIPS140環境変数は、ビルドプロセス中に使用するGo cryptoモジュールのバージョンを選択するために使用され、fips140 GODEBUG設定は、ランタイムにFIPS 140-3モードを有効にするために使用されます。現在、Go 1.24に含まれるGo cryptoモジュールバージョンv1.0.0は、CMVP認定ラボによって厳密にテストされています。
新しい実験的なtesting/synctestパッケージ
testing/synctestパッケージは、特に同時実行コードのテストを強力にサポートします。その中で、synctest.Run関数は、分離された「バブル」でgoroutineのグループを開始できます。この「バブル」では、timeパッケージの関数はフェイククロックに基づいて実行されます。synctest.Wait関数は、現在の「バブル」内のすべてのgoroutineがブロックされた状態になるのを待機するために使用されます。このパッケージは現在実験段階にあることに注意してください。ビルドプロセス中に有効にするには、GOEXPERIMENT=synctestを設定する必要があり、そのAPIは将来のバージョンで変更される可能性があります。
ライブラリのマイナーチェンジ
Go 1.24は、複数の標準ライブラリパッケージの関数を更新し、メソッドを改善しました。たとえば、archiveパッケージは、空のディレクトリを書き込むときにディレクトリヘッダーを自動的に追加します。bytesパッケージとstringsパッケージは、複数のイテレーター関連関数を追加し、開発者が文字列とバイトスライスを操作しやすくしました。cryptoパッケージ内の複数のサブパッケージは、そのメソッドと関数を調整および強化し、暗号化関連関数のセキュリティとパフォーマンスをさらに向上させました。encodingパッケージは、TextAppenderインターフェイスとBinaryAppenderインターフェイスを追加し、オブジェクトのシリアル化プロセスを最適化しました。net/httpパッケージはHTTP/2のサポートを拡張し、開発者により強力なHTTPサーバーおよびクライアント開発機能を提供します。
VIII. ポート
Go 1.24には、実行環境のポート要件にもいくつかの変更があります。Linuxシステムでは、カーネルバージョンが3.2以降である必要があります。macOS 11 Big Surをサポートする最後のバージョンです。Go 1.25以降、macOS 12 Monterey以降が必要になります。WebAssemblyの観点から、go:wasmexportディレクティブが追加され、より多くのタイプとビルドモードがサポートされ、関連するサポートファイルの場所も変更されました。さらに、32ビットwindows/armポートは壊れているとマークされており、正常に動作しない可能性があります。
Leapcell: Golangホスティングに最適なサーバーレスプラットフォーム

最後に、Golangサービスのデプロイに最適なプラットフォームをお勧めします。**Leapcell**です。
1. 多言語サポート
- JavaScript、Python、Go、またはRustで開発します。
2. 無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金を支払い、リクエストや料金はかかりません。
3. 比類のないコスト効率
- アイドル料金なしの従量課金。
- 例:25ドルで、平均応答時間60msで694万件のリクエストをサポートします。
4. 合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
5. 簡単なスケーラビリティと高パフォーマンス
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロで、構築に集中できます。

Leapcell Twitter: https://x.com/LeapcellHQ

