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

メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65

Avatar for utagawa kiki

utagawa kiki

June 06, 2026

More Decks by utagawa kiki

Other Decks in Programming

Transcript

  1. おしながき • ジェネリクス以前 ◦ Go ~1.17 • ジェネリクス以降 ◦ Go

    1.18~ • メソッドのジェネリクスで広がる夢 ◦ Go 1.27?~ 4
  2. ジェネリクスの導入 (1.18) • 汎用的な関数・型をジェネリクスで書ける • 嬉しさ ◦ 型・関数を使い回せる (場合がある) ◦

    リフレクションが不要になる (場合がある) ◦ シグネチャがより直感的になる (場合がある) • ただし制約が強い 15
  3. 型・関数を使い回せる • database/sql ◦ nullableなカラムを表す型が分かれていた ▪ bool, []byte, float64, int{16,32,64},

    string, time.Time 向けの型がそれぞれ定義されていた ◦ Null[T] 型を使えばよくなった 16
  4. シグネチャがより直感的になる (2) var asErr *SomeError if ok := errors.As(err, &asErr);

    ok { // asErr != nil } // 第2引数はerrorじゃなくても渡せてしまう 19
  5. シグネチャがより直感的になる (3) if asErr, ok := errors.AsType[*SomeError](err); ok { //

    asErr != nil } // ジェネリクスの型制約で errorであることが // コンパイル時に保証されている 20
  6. Goのジェネリクスの限界 (1) • メソッドに型引数を渡せない ◦ func (x *List[T]) Map[U any](...)

    ▪ 文法的には書けるがコンパイルエラー ◦ Option型とか作るときに困りがち ▪ メソッドにできないので関数にする 21
  7. おさらい: ジェネリクスの導入 (1.18) • 汎用的な関数・型をジェネリクスで書ける • 嬉しさ ◦ 型・関数を使い回せる (場合がある)

    ◦ リフレクションが不要になる (場合がある) ◦ シグネチャがより直感的になる (場合がある) • ただし制約が強い 23
  8. 夢: パイプライン演算子 • g(f(x)) が x |> f |> g

    みたいに書けるやつ ◦ Apply(x, f.Pipe(g)) • かっこいい ◦ 気をつけないとむしろ読みづらくなる ◦ いいインタフェースにしないと破滅しそう 33