Slide 1

Slide 1 text

Go Generics 超入門 Kyoto.go Remote #28 LT会 (2022/02/23)

Slide 2

Slide 2 text

自己紹介 ● Kyoto.go オーガナイザー ● Kyoto.rb オーガナイザー ● Go Conference 運営メンバー ● Money Forward ○ 技術広報 && ソフトウェアエンジニア ○ RubyときどきGo ● 最近のできごと ○ 最近親知らずレスになりました ○ GoCon2022 Springの登壇準備が……

Slide 3

Slide 3 text

本日のお品書き ● ジェネリクス / Generics ● 型パラメータと制約 / Type parameters and Constraints ● 遊んでみた所感 / Impression ※ 2022/02/23時点でGo 1.18はリリースされていません。

Slide 4

Slide 4 text

ジェネリクス / Generics

Slide 5

Slide 5 text

ジェネリクスそのものおさらい ● ジェネリクスとは? ○ 同じコードでさまざまなデータ型のデータを処理できる言語仕様、あるいはプ ログラミング手法のこと ○ 型を抽象化してコードの再利用性を高めつつ、静的型付け言語の型安全性 を維持できる

Slide 6

Slide 6 text

ごちゃごちゃいうよりコード書いたほうが早い ● Non-Generics ver: https://go.dev/play/p/fKJokTPSAw5 ● Generics ver: https://go.dev/play/p/HdvMV45bD-s

Slide 7

Slide 7 text

型パラメータと制約 / Type parameters and Constraints

Slide 8

Slide 8 text

最低限これだけ抑える概念 ● 型パラメータ(type parameters) ○ 具体的に型が決まってないときに使うものの総称 ● 型引数 ○ ジェネリクスな型や関数に具体的な型を指定する ○ 型推論で省略できる ● 制約(constraints) ○ 型パラメータへの制約として機能する ○ 事前宣言された制約に any と comparable が追加 ● 型セットとかも説明しようと思ったけど多分時間ないのでスキップ

Slide 9

Slide 9 text

コードで説明 func Min[T int | float64](a, b T) T { if a < b { return a } return b } func main() { fmt.Println(Min[int](5, 2)) fmt.Println(Min[float64](3.1, 9.7)) } https://go.dev/play/p/uCZq2OnksPK 型パラメータ 型引数

Slide 10

Slide 10 text

コードで説明 type ID uint func (id ID) String() string { return fmt.Sprintf("%d", id) } func Print[T fmt.Stringer](s []T) { for _, v := range s { fmt.Printf("id: %s,", v.String()) } } func main() { Print([]ID{1, 3, 90, 23}) } https://go.dev/play/p/ZeHIDX1LQyX 制約

Slide 11

Slide 11 text

まとめ ● これまで ○ それぞれのデータ型ごとの関数を定義 ■ とても面倒くさい。Goのdisられポイントだった ● これから(Go 1.18以降) ○ Genericsを使いデータ型を抽象化することができる ○ 型パラメータ、型引数、制約あたりを押さえていれば書き始めることができ る。

Slide 12

Slide 12 text

遊んでみた所感 / Impression

Slide 13

Slide 13 text

遊んでみた所感 ● Generics楽しい ○ 他言語(Ruby/PHP/NodeJS)からGoに書き換えたいときに多用しそう ○ constraints/slices/maps が含まれなかったのは残念(´;ω;`) ● キャッチアップ大変 ○ Go 1.18も機能マシマシだったけどGo 1.19もマシマシになりそう

Slide 14

Slide 14 text

より詳しくGenerics沼に落ちたいかたはこちら ● Tutorial: Getting started with generics ○ https://go.dev/doc/tutorial/generics ● go generics for the busy gophers ○ https://sethops1.net/post/go-generics-for-the-busy-gopher/ ● Go 言語にやってくる Generics は我々に何をもたらすのか ○ https://zenn.dev/mattn/books/4c7de85ec42cb44cf285 ● Go 1.18集中連載 ジェネリクス ○ https://future-architect.github.io/articles/20220209a/

Slide 15

Slide 15 text

より詳しくGenerics沼に落ちたいかたはこちら ● Goにこれから入る機能について ○ https://docs.google.com/presentation/d/10YX-P5wChDmBRXqUDDWN ThtBXvg81EdS4vhUS_iRtdk/edit#slide=id.p ● Go の "Type Sets" proposal を読む ○ https://zenn.dev/nobishii/articles/99a2b55e2d3e50 ● What's new in Go 1.18? ○ https://speakerdeck.com/syumai/whats-new-in-go-1-dot-18