Slide 1

Slide 1 text

What's new in Go 1.24? シアラナ Go 1.24 リリースパーティ 2025-02-26

Slide 2

Slide 2 text

自己紹介 ● シアラナ ○ X: cia_rana / Zenn: koya_iwamura ● 株式会社サイバーエージェント ○ 新規プロジェクトでサーバーサイドエンジニア ● New Featuresシリーズ書いてます

Slide 3

Slide 3 text

リリースおめでとうございます 🎉

Slide 4

Slide 4 text

Generic Type Aliases 👈 👈

Slide 5

Slide 5 text

公式で 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)に格納される

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

GOCACHEPROG ● ビルドキャッシュの保存処理を別プロセスに委譲する機構 ● 柔軟なビルドキャッシュの管理が可能となる ● 委譲先プロセスを起動するコマンドを、環境変数 GOCACHEPROG に指定してビ ルドする

Slide 8

Slide 8 text

ランタイムの CPU 負荷 2~3% 減少 ● map が Swiss Table ベースに変更 ● 小さいオブジェクトのより効率的なメモリ割り当て ● ランタイム内部の排他機構の改善

Slide 9

Slide 9 text

weak package 🆕 ● 通常の参照が強参照と呼ばれるのに対する弱参照(weak pointer)を扱う package が追加された ● 強参照は、それが指す値への参照がある限り GC されない ● 弱参照は、それが指す値への参照があっても GC される可能性がある ● 値をメモリに保持し続けなくて良いキャッシュなどで活用できそう ● 関数 runtime.KeepAlive で GC されるタイミングを延期できる

Slide 10

Slide 10 text

crypto/mlkem package 🆕 ● 公開鍵暗号は計算困難度により安全性が保たれている ● 量子コンピュータの台頭により従来のアルゴリズムでは解かれる可能性が出てき た ● それに対抗するための耐量子暗号アルゴリズムも考案されている ● そのうちの一つである鍵交換 *1 ML-KEM が実用化されてきており、 Go1.24で package 化された *1: 正確には鍵カプセル化メカニズム

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

crypto/rand package ● 関数 Read は必ず nil を返すようになった ○ Go1.23 まででエラーを返す状況では Go1.24からは panic になる ● exported 変数 Reader は最新の Linux 環境において、vDSO *1 経由でシステム コール getrandom(2) を呼び出すようになった ○ システムコールを呼び出すオーバーヘッド削減のため ● 関数 Text が追加 ○ base32([A-Z2-7]) の範囲でランダムな長さ26の文字列を生成する *1: 頻繁に呼び出すシステムコールをカーネルモードに入らずに呼び出せる機能

Slide 13

Slide 13 text

crypto/subtle package ● 関数 WithDataIndependentTiming が追加された ○ データに依存して処理時間が決まるアルゴリズムや CPU 命令がある ○ この特性を利用して元のデータを特定するタイミング攻撃を回避するために追 加された ○ ARM64 の DIT がサポートされた環境でのみ使用可能

Slide 14

Slide 14 text

encoding/json package ● JSON Marshal 時に利用する struct tag omitzero が追加された ○ omitempty とほぼ同じ ○ 違いとしては、struct の空値を Marshal する際に、omitempty は フィールドが省略されないのに対し、omitzero は省略される ○ 例えば型 time.Time のゼロ値 time.Time{} は、omitzero のみ省略される ○ メソッド IsZero() bool が実装されていて true を返す場合も省略される

Slide 15

Slide 15 text

log/slog package ● exported 変数 DiscardHandler が追加された ○ 出力を破棄できる

Slide 16

Slide 16 text

math/rand package ● 関数 Seed が機能しなくなった ○ 元々非推奨だったので影響はほぼなさそう

Slide 17

Slide 17 text

net package ● MultiPath TCP が、サポートされている Linux 環境でデフォルトで使用されるように なった 参考: 【MPTCP】ライブ配信の通信安定化に向けて MultiPath TCP を試験導入している話 - Mirrativ Tech Blog https://tech.mirrativ.stream/entry/mirrativ-multipath-tcp-streaming

Slide 18

Slide 18 text

os package ● 型 Root が追加された ○ この型経由のディレクトリ/ファイルアクセスは dir 配下に制限される ○ 関数 OpenRoot(dir string) (*Root, error) で初期化する

Slide 19

Slide 19 text

runtime package ● 関数 GOROOT が非推奨になった ○ ビルド時の GOROOT がバイナリに書き込まれ、関数呼び出し時はそれ返す ようになっていた ○ ビルド時と実行時では環境が異なる場合がある ○ つまり、無効な値が返っている可能性があった ○ これからは go env GOROOT で代替する

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

testing package ● メソッド B.Loop が追加された ○ for range b.N {} の代わりに for b.Loop() {} でベンチマークを回すようになる ○ B.N の場合、十分にベンチマーク結果が溜まるまでベンチマーク関数が呼ばれていた → setup, cleanup 処理が複数回実行されていた ○ B.Loop の場合、ベンチマーク関数が呼ばれるのは 1回のみ ○ ループした回数は B.N に格納されている

Slide 22

Slide 22 text

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