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

What's new in Go 1.27?

What's new in Go 1.27?

Avatar for Koya IWAMURA

Koya IWAMURA

August 18, 2026

More Decks by Koya IWAMURA

Other Decks in Technology

Transcript

  1. ジェネリックメソッド(1/4) - 基本的な使い方 型パラメータを定義可能に メソッドで type Container[T any] struct {

    items []T } // structとは独立したメソッド独自の型パラメータU func (c *Container[T]) Map[U any](fn func(T) U) *Container[U] { result := &Container[U]{} for _, item := range c.items { result.items = append(result.items, fn(item)) } return result } 4
  2. ジェネリックメソッド(2/4) - メソッドチェーン 複数のメソッドをチェーンして処理パイプライン構築 // Filter: 条件に合う要素をフィルタ func (c *Container[T])

    Filter(f func(T) bool) *Container[T] { result := &Container[T]{} for _, item := range c.items { if f(item) { result.items = append(result.items, item) } } return result } // 実行 result := container.Filter(isEven).Map(square).Filter(isLarge) 新しいContainerを返すことでチェーン可能 5
  3. ジェネリックメソッド(3/4) - イテレータメソッドチェーン func (c *Container[T]) AsSeq() SeqIter[T] { /*

    iterに変換 */ } type SeqIter[T any] struct { seq iter.Seq[T] } func (si SeqIter[T]) Filter(f func(T) bool) SeqIter[T] { /* ... */ } func (si SeqIter[T]) Map[U any](f func(T) U) SeqIter[U] { /* ... */ } // 実行 for item := range container.AsSeq().Filter(isPositive).Map(toString).seq { fmt.Println(item) } 全要素をメモリに載せず、1つずつストリーミング処理 6
  4. ジェネリックメソッド(4/4) - 制限事項 宣言できない インターフェースメソッドは型パラメータを type Converter interface { Convert(input

    any) any } type MyConverter struct{} func (m *MyConverter) Convert[T, U any](input T) U { /* ... */ } var conv Converter = &MyConverter{} // コンパイルエラー // エラー文 // *MyConverter does not implement Converter // have Convert[T, U any](T) U // want Convert(any) any 7
  5. 構造体リテラルのフィールドセレクタ 埋め込みフィールドを持つ構造体リテラルで、 可能に 埋め込み型のフィールドを直接指定 type Email struct { Address string

    } type User struct { Email // 埋め込みフィールド Name string } // Go 1.26: 埋め込み型を経由 user := User{Email: Email{Address: "[email protected]"}, Name: "Alice"} // Go 1.27: 直接指定 user := User{Address: "[email protected]", Name: "Alice"} 8
  6. 関数型推論の汎化 ジェネリック関数を関数型に代入する際、 複合リテラル内でも型パラメータが推論されるように type Config struct { filter func(int) bool

    } func Filter[T any](T) bool { return true } // Go 1.26: 型指定が必須 cfg := Config{filter: Filter[int]} // Go 1.27: 型推論で自動決定 cfg := Config{filter: Filter} // T=intが推論される 9
  7. go test コマンドの改善 stdversion チェックの自動実行 go test がデフォルトで vet チェック

    stdversion を実行 go.mod で指定されたGoバージョンより新しいシンボル使用を検出 例: go.mod で Go 1.26 を指定 → Go 1.27 の uuid.New() を使用していると検知される 10
  8. go fix の改善(1/2) 新しいモダナイザが追加 atomictypes: atomic.AddInt32(&x, 1) → atomic.Int32 embedlit:

    構造体リテラルのフィールドセレクタを使用 slicesbackward: 逆順 for ループ → slices.Backward() unsafefuncs: ポインタ演算 → unsafe.Add() waitgroupgo: wg.Add(1) + defer wg.Done() → wg.Go() 従来の waitgroup から改名 12
  9. go mod tidy の自動整理 複数の require ブロックを2 つに統合 direct と

    indirect の2つ Go 1.27 以降のモジュールが対象 14
  10. メモリ割り当ての最適化 80 バイト未満のメモリ割当が最大 30% 高速化 割当サイズごとに最適化された専用処理を使用 専用処理追加のためバイナリサイズ約 60KB 増加 最適化の仕組み

    1. アライメント計算の最適化: 割当サイズが決定済なので複雑な判定不要 2. 分岐の削減: 条件分岐を削除 3. キャッシュ効率: 命令数が少なくなり CPU 命令キャッシュに収まる 15
  11. encoding/json/v2 の GA encoding/json/v2 : 改良版のJSONパッケージ encoding/json/jsontext : JSONの低レベル操作用API v2

    の特徴(一例) アンマーシャリングが大幅高速化 より厳密なデフォルト動作 不正なUTF-8があるとエラー 重複キーがあるとエラー キー順序をソートしない(元の順序保持) encoding/json/v2 Migration Guide 16
  12. uuid UUID生成・解析が標準パッケージに追加 // 生成 id := uuid.New() id7 := uuid.NewV7()

    // 通常はv4 // 時系列順序付き // 解析・操作 parsed, _ := uuid.Parse("550e8400-e29b-41d4-...") cmp := id.Compare(id7) // 比較 text, _ := id.MarshalText() // テキスト形式 17
  13. bytes/strings CutLast 関数 最後の出現位置で分割 セパレータの data := []byte("hello---world---end") // Cut:

    最初の「---」で分割(元からあったメソッド) before, after, _ := bytes.Cut(data, []byte("---")) // before=[]byte("hello"), after=[]byte("world---end") // CutLast: 最後の「---」で分割(追加されたメソッド) before, after, _ := bytes.CutLast(data, []byte("---")) // before=[]byte("hello---world"), after=[]byte("end") 18
  14. compress/flate の最適化(1/2) 圧縮性能の改善 Digits(レベル Default): 53.73% 高速化 Newton(レベル Default): 270%

    高速化 ランダムデータ圧縮(レベル 2-6): ~100 倍 高速化 主な実装変更点 compressor 構造体のフィールドの順番を再編成 ポインタフィールドを前に集約 GCが走査すべきポインタの範囲が縮小 GC時のスキャン時間が短縮 19
  15. math/rand/v2 N[T intType](n T) T 関数 様々な整数型で統一的な乱数生成 r := rand.New(rand.NewSource(42))

    n32 := r.N(int32(100)) // int32型:[0, 100) n64 := r.N(uint64(1000)) // uint64型:[0, 1000) 23