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

What's new in Go 1.21?

Koya IWAMURA
October 31, 2023

What's new in Go 1.21?

Koya IWAMURA

October 31, 2023
Tweet

More Decks by Koya IWAMURA

Other Decks in Technology

Transcript

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

    株式会社アプリボット ◦ 新規プロジェクトでサーバーサイドエンジニア • Goの記事書いたり、コントリビュートしたり
  2. PGOの本格導入 • PGO = Profile-Guided Optimization • 実行時にリソースの利用状況を収集し、次回のコンパイル最適化に活かす手法 ◦ Go1.21時点では、インライン展開、devirtualizationに効いてくる

    • Go 1.20ではパブリックプレビュー版だったが、今回で正式にリリースとなった • package mainにdefault.pgoがあれば自動的に利用される • -pgoフラグで読み込むファイルを指定できる ◦ デフォルトは-pgo=auto ◦ オフにするには-pgo=off • 詳しくは The Go Blog『Profile-guided optimization in Go 1.21』参照
  3. cmp package • func Compare ◦ 比較結果を-1, 0, +1で返す •

    func Less ◦ 比較結果をbool値で返す • type Ordered ◦ 比較可能なunderlying typeを含むプリミティブ型を集めたconstraint ◦ ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | ~string • package github.com/google/go-cmpとは別物
  4. slices package • func Clip ◦ capをlenまで縮退し、無駄なcapを削減 • func Compare

    ◦ 2つのsliceを比較 ◦ 要素の大小やlenによって-1, 0, +1を返す • func Contains ◦ 指定した要素が含まれるかチェック • func Insert ◦ i番目に要素を挿入 ◦ 元のsliceを書き換えない • func IsSorted ◦ 昇順にソートされているかチェック • func Replace ◦ iからj番目の要素を可変長引数の要素で置換 ◦ 元のsliceを書き換えない • func Max, Min ◦ sliceの要素の中で最大値、最小値を求める
  5. maps package • func Clone ◦ Shallow copy • func

    Copy ◦ 一方のmapのkey-valueを、もう一方のmapに追加 • func DeleteFunc ◦ 特定の要素を削除 • func Equel ◦ 2つのmapのkey-value同士を比較し、等しいかをチェック • func Keys, ValuesはGo1.22で導入予定のiterで使用用途的に代替できるため見送り
  6. runtime/metrics package • GCの挙動が追いやすくなるメトリクスが追加された ◦ /gc/gogc:percent ▪ GOGCやruntime/debug.SetGCPercentで設定された値(default: 100) ◦

    /gc/gomemlimit:bytes ▪ GOMEMLIMITやruntime/debug.SetMemoryLimitで設定された値(default: math.MaxInt64) ◦ /gc/heap/live:bytes ▪ 直近のGCサイクルでマークされたヒープ ◦ /gc/scan/globals:bytes ▪ スキャン可能なグローバル変数 ◦ /gc/scan/heap:bytes ▪ スキャン可能なヒープ ◦ /gc/scan/stack:bytes ▪ 直近のGCサイクルでスキャンされたスタック ◦ /gc/scan/total:bytes ▪ /gc/scanの合計
  7. sync OnceFunc, OnceValue, OnceValues • 構造体Onceを利用した頻出パターンを関数化した OnceFunc, OnceValue, OnceValuesが追加された •

    struct Once ◦ OnceのメソッドDoを一度だけ実行することを保証する • func OnceFunc ◦ 引数に渡された関数を一度だけ実行することを保証する ◦ Onceの簡略化バージョン • func OnceValue ◦ 引数に渡された関数を一度だけ実行することを保証し、 何度呼び出しても毎回同じ戻り値を 1つ返す ◦ OnceFuncの戻り値ありバージョン • func OnceValues ◦ 引数に渡された関数を一度だけ実行することを保証し、 何度呼び出しても毎回同じ戻り値を 2つ返す ◦ OnceValueの戻り値2つバージョンで、errorを返す場合などに使う
  8. Appendix • Go1.21 New Features ◦ 今回紹介できなかったGenericsの型推論やslices package、 goコマンドのフラグ等々について書いているのでぜひ 🙌

    • [Blog] Backward Compatibility, Go 1.21, and Go 2 • [Doc] Go, Backwards Compatibility, and GODEBUG • [Blog] Forward Compatibility and Toolchain Management in Go 1.21 • [Blog] Perfectly Reproducible, Verified Go Toolchains • [Doc] Go Toolchains • [Blog] WASI support in Go