1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go 1.24登場!史上最速&最適化されたGoの全貌!

Posted at

Group471.png

Leapcell: The Best Serverless Platform for Golang Hosting

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 toolgo install toolなどです。

ビルドとテストコマンドの強化

go rungo toolによって作成される実行可能ファイルは、現在、Goビルドキャッシュに自動的にキャッシュされます。この最適化により、繰り返し実行する際の速度が大幅に向上しますが、それに伴いキャッシュに占めるスペースも増えます。go buildgo installgo testコマンドすべてには新しい-jsonフラグがあり、構造化されたJSON形式でビルド結果とエラーメッセージを出力するために使用されます。go test -jsonの出力では、新しいAction型によってビルドとテスト結果のJSONデータが区別されます。テスト統合システムに問題がある場合、開発者は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アナライザが追加されました。これは主に、テストパッケージ内のテスト、ファズテスト、ベンチマーク、およびサンプルの宣言において発生する可能性のある一般的なエラーをチェックするために使用されます。例えば、誤った名前形式、誤った署名、またはサンプルレコード内の存在しない識別子などです。このアナライザは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%削減されることが確認されています。これらの最適化は主に、スイステーブルに基づく新しい組み込みmapの実装、より効率的な小オブジェクトのメモリ割り当て、そして新しいランタイム内部ミューテックスに反映されています。開発者が特別なニーズがあり、新しい組み込みmapの実装とランタイム内部ミューテックスを無効にしたい場合は、それぞれGOEXPERIMENT=noswissmapGOEXPERIMENT=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() {
        // 実際のベンチマークコード
    }
}

改良されたファイナライザ

runtime.AddCleanup関数はruntime.SetFinalizerよりも柔軟で効率的でエラーが起きにくくなりました。これにより、開発者はオブジェクトにクリーンアップ関数を添付できます。オブジェクトが参照できなくなると、クリーンアップ関数が自動的に実行されます。この関数は、同じオブジェクトに複数のクリーンアップ関数を添付することをサポートし、内部ポインタにも添付可能です。オブジェクトが循環参照を形成する場合、runtime.AddCleanupは一般的にメモリリークを引き起こさず、オブジェクトとそれが参照するオブジェクトの解放を遅延させません。したがって、新しいコードを書く際には、まずruntime.AddCleanupを使用することが推奨されます。

新しいweakパッケージ

weakパッケージの導入により、開発者に弱参照ポインタが提供されました。これは、メモリ効率の高い構造体、例えば弱参照マップ、正規化マップ、およびさまざまなキャッシュを作成する際に非常に役立ちます。runtime.AddCleanupmaphash.Comparableを組み合わせることで、これらのシナリオでの使用要件をよりよく満たすことができ、プログラムのメモリ管理効率をさらに向上させます。

新しいcryptoパッケージ

crypto/mlkemパッケージは、2つのポスト量子鍵交換メカニズムであるML - KEM - 768とML - KEM - 1024を成功裏に実装しました。crypto/hkdfcrypto/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関数は、孤立した「バブル」内でゴルーチンのグループを起動できます。この中で、timeパッケージの機能は偽のクロックに基づいて動作します。synctest.Wait関数は、現在の「バブル」内のすべてのゴルーチンがブロック状態に入るのを待つために使用されます。なお、このパッケージは現在実験段階です。ビルドプロセス中に有効にするには、GOEXPERIMENT=synctestを設定する必要があり、将来のバージョンでAPIが変更される可能性があります。

ライブラリの小さな変更

Go 1.24では、複数の標準ライブラリパッケージの機能が更新され、メソッドが改善されています。例えば、archiveパッケージは、空のディレクトリを書き込む際に自動的にディレクトリヘッダを追加します。bytesstringsパッケージには、文字列とバイトスライスの操作を容易にするための複数のイテレータ関連の関数が追加されました。cryptoパッケージ内の複数のサブパッケージは、そのメソッドと機能を調整・強化し、暗号関連機能のセキュリティとパフォーマンスをさらに向上させています。encodingパッケージにはTextAppenderBinaryAppenderインターフェイスが追加され、オブジェクトのシリアル化プロセスが最適化されました。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: The Best Serverless Platform for Golang Hosting

barndpic.png

最後に、Golangサービスの展開に最適なプラットフォームをおすすめします:Leapcell

1. 多言語対応

  • JavaScript、Python、Go、またはRustで開発可能。

2. 無制限のプロジェクトを無料で展開

  • 使用量に応じて課金 — リクエストがなければ料金はかかりません。

3. 抜群のコスト効率

  • 使い放題課金で、アイドル時の料金はかかりません。
  • 例:25ドルで平均応答時間60msで694万回のリクエストをサポートできます。

4. シンプルな開発者体験

  • 直感的なUIで簡単にセットアップ可能。
  • 完全自動化されたCI/CDパイプラインとGitOps統合。
  • アクション可能なインサイトを得るためのリアルタイムメトリックとログ。

5. 簡単なスケーラビリティと高性能

  • 高い並行処理を簡単に処理できる自動スケーリング。
  • 運用オーバーヘッドはゼロ — 構築に集中できます。

Frame3-withpadding2x.png

ドキュメントでもっと詳しく調べる!

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?