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