Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's new in Go 1.24?

Koya IWAMURA
February 26, 2025

What's new in Go 1.24?

Koya IWAMURA

February 26, 2025
Tweet

More Decks by Koya IWAMURA

Other Decks in Technology

Transcript

  1. 自己紹介 • シアラナ ◦ X: cia_rana / Zenn: koya_iwamura •

    株式会社サイバーエージェント ◦ 新規プロジェクトでサーバーサイドエンジニア • New Featuresシリーズ書いてます
  2. 公式で tool のバージョン管理がサポート • Go1.23まで: ◦ tools.go に blank import

    + //go:build tools で管理するのが推奨されていた • Go1.24から: ◦ go get -tool path/to/toolname で tool の管理ができる ◦ toolのバージョンはgo.modで管理される ◦ toolは go tool toolname で実行できる ◦ ツールのバイナリはビルドキャッシュ(go env GOCACHE)に格納される
  3. GOAUTH • 公開されていないリポジトリから package を go get する際に 認証情報が求められる •

    go get では http.DefaultClient が使われるため、custom import path で ヘッダ等を使って認証情報を渡す必要がある場合に、その手段がなかった ◦ custom import path: GitHub や BitBucket 等 well-known ではない import path ◦ Remote import paths • 環境変数 GOAUTH を使って認証を行う仕組みが追加された ◦ GOAUTH environment variable
  4. ランタイムの CPU 負荷 2~3% 減少 • map が Swiss Table

    ベースに変更 • 小さいオブジェクトのより効率的なメモリ割り当て • ランタイム内部の排他機構の改善
  5. weak package 🆕 • 通常の参照が強参照と呼ばれるのに対する弱参照(weak pointer)を扱う package が追加された • 強参照は、それが指す値への参照がある限り

    GC されない • 弱参照は、それが指す値への参照があっても GC される可能性がある • 値をメモリに保持し続けなくて良いキャッシュなどで活用できそう • 関数 runtime.KeepAlive で GC されるタイミングを延期できる
  6. bytes, strings package • Lines ◦ 改行区切りの bytes/string を生成するイテレータを返す •

    SplitSeq, SplitAfterSeq ◦ 引数のセパレータ区切りの bytes/string を生成するイテレータを返す ◦ After は後ろから走査するのではなく、セパレータが bytes/string の末尾につ くことを指していることに注意 ◦ Split, SplitAfter のイテレータ版 • FieldsSeq, FieldsSeqFunc ◦ 空白 *1 区切りの bytes/string を生成するイテレータを返す ◦ Fields, FieldsFunc のイテレータ版 *1: unicode.IsSpace
  7. crypto/rand package • 関数 Read は必ず nil を返すようになった ◦ Go1.23

    まででエラーを返す状況では Go1.24からは panic になる • exported 変数 Reader は最新の Linux 環境において、vDSO *1 経由でシステム コール getrandom(2) を呼び出すようになった ◦ システムコールを呼び出すオーバーヘッド削減のため • 関数 Text が追加 ◦ base32([A-Z2-7]) の範囲でランダムな長さ26の文字列を生成する *1: 頻繁に呼び出すシステムコールをカーネルモードに入らずに呼び出せる機能
  8. crypto/subtle package • 関数 WithDataIndependentTiming が追加された ◦ データに依存して処理時間が決まるアルゴリズムや CPU 命令がある

    ◦ この特性を利用して元のデータを特定するタイミング攻撃を回避するために追 加された ◦ ARM64 の DIT がサポートされた環境でのみ使用可能
  9. encoding/json package • JSON Marshal 時に利用する struct tag omitzero が追加された

    ◦ omitempty とほぼ同じ ◦ 違いとしては、struct の空値を Marshal する際に、omitempty は フィールドが省略されないのに対し、omitzero は省略される ◦ 例えば型 time.Time のゼロ値 time.Time{} は、omitzero のみ省略される ◦ メソッド IsZero() bool が実装されていて true を返す場合も省略される
  10. net package • MultiPath TCP が、サポートされている Linux 環境でデフォルトで使用されるように なった 参考:

    【MPTCP】ライブ配信の通信安定化に向けて MultiPath TCP を試験導入している話 - Mirrativ Tech Blog https://tech.mirrativ.stream/entry/mirrativ-multipath-tcp-streaming
  11. runtime package • 関数 GOROOT が非推奨になった ◦ ビルド時の GOROOT がバイナリに書き込まれ、関数呼び出し時はそれ返す

    ようになっていた ◦ ビルド時と実行時では環境が異なる場合がある ◦ つまり、無効な値が返っている可能性があった ◦ これからは go env GOROOT で代替する
  12. testing package • メソッド (T|B|F).Context が追加された ◦ testing 用の context.Context

    を生成する ◦ 今まで context.Background() で生成していたものの代替となる ◦ testing 終了時や Cleanup 開始時に context cancel される • メソッド (T|B|F).Chdir が追加された ◦ testing 最中に working directory を変更できる ◦ 並行処理中での使用は非推奨 ▪ プロセス全体で working directory を共有しているため
  13. testing package • メソッド B.Loop が追加された ◦ for range b.N

    {} の代わりに for b.Loop() {} でベンチマークを回すようになる ◦ B.N の場合、十分にベンチマーク結果が溜まるまでベンチマーク関数が呼ばれていた → setup, cleanup 処理が複数回実行されていた ◦ B.Loop の場合、ベンチマーク関数が呼ばれるのは 1回のみ ◦ ループした回数は B.N に格納されている
  14. Appendix • Go1.24 New Features • [Doc] Go 1.24 Release

    Notes • [Blog] Go 1.24 is released! • [Blog] Extensible Wasm Applications with Go • [Blog] Testing concurrent code with testing/synctest • [Blog] What's in an (Alias) Name? • [Doc] FIPS 140-3 Compliance • [Google Cloud Blog] Announcing Wasm support in Go 1.24