Slide 1

Slide 1 text

ࣾ಺ษڧձ Go Generics Overview @karupanerura

Slide 2

Slide 2 text

• Software Engineer @ DeNA • Perl / Go / Java / Type Script • AWS / Google Cloud • Japan Perl Association ୅ද • Shibuya.pm Ϧʔμʔ @karupanerura

Slide 3

Slide 3 text

Agenda • Generics ͱ͸ • Ͱ͖Δ͜ͱ • Ͱ͖ͳ͍͜ͱ • ࣮༻ྫ • ·ͱΊ

Slide 4

Slide 4 text

Generics #ͱ͸

Slide 5

Slide 5 text

Generics • ܕ(Type)ͷҰछɺ૯শܕ • ʮҰఆͷ੍໿Λຬͨ͢ܕʯΛ෦෼తʹ࣋ͭܕΛදݱ͢Δ • e.g.) type Array[T any] []T // TΛཁૉͱͯ࣋ͭ͠഑ྻ • e.g.) func identity[T any](v T) T { return v } // Tܕͷ஋Λड͚औͬͯฦؔ͢਺ • ܕͷදݱͷࣗ༝౓্͕͕Δ

Slide 6

Slide 6 text

Genericsͷ࣮ݱํ๏ • શల։ʢC++΍RustͳͲʣ • ར༻͞Ε͍ͯΔ͢΂ͯͷύλʔϯΛίϯύΠϧ࣌ʹల։͢Δ • ܕফڈʢJava΍Type ScriptͳͲʣ • ܕνΣοΫ͚ͩʹར༻ͯ͠anyͳͲͷԿͰ΋ड͚ೖΕΔܕʹஔ͖׵͑Δ • ͦͷଞʢC#΍GoͳͲʣ • ༷ʑ

Slide 7

Slide 7 text

Genericsͷ࣮ݱํ๏ͷྑ͠ѱ͠ • શల։ • ΞηϯϒϦϨϕϧͰ͸௨ৗͷؔ਺ͱมΘΒͳ͍ͷͰύϑΥʔϚϯε͕ྑ͍ • Ͳ͏ͯ͠΋ϓϩάϥϜαΠζ͕૿͑Δ • ܕফڈ • ίϯύΠϧ͞ΕΔϓϩάϥϜαΠζΛখ͘͞Ͱ͖Δ • ܕม਺ʹॊೈͳ੍໿ֻ͕͚ΒΕΔʢίϯύΠϧ࣌ʹෆఆͳ੍໿΋Մೳʣ • ܕ৘ใΛ࣮ߦ࣌ʹ࢒͢࢓૊Έʹͳ͍ͬͯͳ͍ͱϦϑϨΫγϣϯ͕Ͱ͖ͳ͍

Slide 8

Slide 8 text

Go Genericsͷ৔߹

Slide 9

Slide 9 text

Go Genericsͷ࢓૊Έ • جຊతʹ͸શల։ͬΆ͍ৼΔ෣͍Λ͢Δ • શల։ͬΆ͍ײ͡ͷ࢓૊ΈͳͷͰrelfectionͷڍಈ΋௚ײత • e.g.) https://go.dev/play/p/z5Sv88yHAqs • GC Shape Stenciling: GC͔Βݟ͑Δܕ͝ͱʹల։͢Δ • ಉҰͷGC Shapeͷ৔߹ͷৼΔ෣͍ͷҧ͍͸ܕ৘ใΛ࣮ߦ࣌ʹࢀরͯ͠ղܾ • ຆͲͷ৔߹͸࣮ࡍͷܕ͝ͱʹผʑͷؔ਺ʹల։͞ΕΔ • refs. https://go.googlesource.com/proposal/+/refs/heads/master/design/generics-implementation-gcshape.md

Slide 10

Slide 10 text

Go Genericsͷจ๏ • ܕ • ܕఆٛ: type GenericType[TypeParameter Constraint] ... • ؔ਺ఆٛ: func GeneicFunc[TypeParameter Constraint](...) ... { ... } • ར༻ • ม਺ఆٛ: var v GenericType[string] • ؔ਺ݺग़: GenericFunc[int](1)

Slide 11

Slide 11 text

ʊਓਓਓਓਓਓਓਓਓਓʊ ʼ ɹಥવͷConstraint ɹʻ ʉY^Y^Y^Y^Y^Y^Y^Y^ʉ

Slide 12

Slide 12 text

Constraint #ͱ͸

Slide 13

Slide 13 text

Constraint • ܕύϥϝʔλͱͯ͠ड͚෇͚Δܕ͕ຬͨ͢΂੍͖໿ • JavaͰ͍͏ͱ͜Ζͷͱ͔͢ΔΠϝʔδ • X[T any] ͱ΍ͬͯͨͱ͜Ζͷany͕ͦΕ • ==, != ͕Ͱ͖ΔܕͰ͋Δ͜ͱΛࣔ͢ comparable ͱ͍͏Constraint΋͋Δ • interfaceܕͱͯ͠දݱ͢Δ • e.g.) type MyConstraintA interface { int64 | int32 } • e.g.) type MyConstraintB interface { ~int64 }

Slide 14

Slide 14 text

Constraint • ܕύϥϝʔλͱͯ͠ड͚෇͚Δܕ͕ຬͨ͢΂੍͖໿ • JavaͰ͍͏ͱ͜Ζͷͱ͔͢ΔΠϝʔδ • X[T any] ͱ΍ͬͯͨͱ͜Ζͷany͕ͦΕ • ==, != ͕Ͱ͖ΔܕͰ͋Δ͜ͱΛࣔ͢ comparable ͱ͍͏Constraint΋͋Δ • interfaceܕͱͯ͠දݱ͢Δ • e.g.) type MyConstraintA interface { int64 | int32 } • e.g.) type MyConstraintB interface { ~int64 } ͳʹ͜Ε

Slide 15

Slide 15 text

~int64 = int64ΛUnderlyng Typeͱ͢Δܕ

Slide 16

Slide 16 text

ʊਓਓਓਓਓਓਓਓਓਓਓʊ ʼ ಥવͷUnderlyng Type ʻ ʉY^Y^Y^Y^Y^Y^Y^Y^Y^ʉ

Slide 17

Slide 17 text

Underlyng Type #ͱ͸ https://zenn.dev/syumai/articles/77bc12aca9b654

Slide 18

Slide 18 text

Underlyng Type #ͱ͸ https://speakerdeck.com/dqneo/go-language-underlying-type

Slide 19

Slide 19 text

Underlyng Typeͬ͘͟Γղઆ • ͢΂ͯͷܕ͕҉໧తʹ࣋ͭ֓೦ • ୅ೖՄೳੑɺܕಉҰੑͳͲΛ൑ఆ͢Δ৚݅ʹͳͬͯ͘Δܕ • ྫ • int64ͷunderlyng type͸int64 • type X int64ͱͨ͠ͱ͖ͷunderlyng type͸int64 • type Y Xͱͨ͠ͱ͖ͷunderlyng type΋int64 • ৄ͍͜͠ͱ͸ઌͷZennͷهࣄ΍SpeakerDeckͷεϥΠυΛಡΜͰ

Slide 20

Slide 20 text

Underlyng Type #ͱ͸ https://speakerdeck.com/dqneo/go-language-underlying-type

Slide 21

Slide 21 text

Underlyng Type Λ࢖ͬͯԿ͕ग़དྷΔ͔ • ͦͷܕ͕ͲͷΑ͏ͳੑ࣭Λ࣋ͭͷ͔͕෼͔Δ • ͨͱ͑͹ ~int64 ͸Ճݮࢉ΍ൺֱԋࢉͳͲ͕Ͱ͖Δ • e.g.) ܕม਺X͕~int64Λຬͨ͢ͳΒXܕͷ஋x,yʹରͯ͠ x > y ͕Ͱ͖Δ • ಉ༷ʹXܕͷ஋x͸~int64Λຬͨ͢ଞͷܕ͔Β҆શʹܕม׵Ͱ͖Δ • OrderedͳͲศརͳ΍ͭΛ·ͱΊͨ४ඪ४ύοέʔδ(experimental)΋͋Δ • golang.org/x/exp/constraints

Slide 22

Slide 22 text

golang.org/x/exp/constraints

Slide 23

Slide 23 text

ʊਓਓਓਓਓਓਓਓਓਓʊ ʼ ɹจ๏ΛৼΓฦΔ ɹʻ ʉY^Y^Y^Y^Y^Y^Y^Y^ʉ

Slide 24

Slide 24 text

Go Genericsͷจ๏ • ܕ • ܕఆٛ: type GenericType[TypeParameter Constraint] ... • ؔ਺ఆٛ: func GeneicFunc[TypeParameter Constraint](...) ... { ... } • ར༻ • ม਺ఆٛ: var v GenericType[string] • ؔ਺ݺग़: GenericFunc[int](1)

Slide 25

Slide 25 text

Go Genericsͷจ๏ͷ۩ମྫ • ܕ • ܕఆٛ: type MyComparableArray[T comparable] []T • ؔ਺ఆٛ: func MyIncrement[T ~int64](v T) T { return v + 1 } • ར༻ • ม਺ఆٛ: x := MyComparableArray[string]{"a", "b", "c"} • ؔ਺ݺग़: MySort([]int{3, 2, 1})

Slide 26

Slide 26 text

͜͜·Ͱͷ·ͱΊ

Slide 27

Slide 27 text

Go GenericsͰग़དྷΔ͜ͱ • ܕͱؔ਺ʹܕม਺Λ෇༩Ͱ͖Δ • ෳ਺෇༩͢Δ͜ͱ΋Ͱ͖Δ • ConstraintͰܕม਺Λ੍໿Ͱ͖Δ • ConstraintͰ͸Underlyng TypeΛ࢖ͬͨࢦఆ΋Մೳ • ಉҰͷUnderlyng TypeΛ࣋ͭܕͷ஋Λ୅ೖ͢Δ͜ͱ͕Ͱ͖Δ • ൺֱԋࢉࢠ΍ࢉज़ԋࢉࢠΛ࢖͏͜ͱ͕Ͱ͖Δ

Slide 28

Slide 28 text

ҰํͰग़དྷͳ͍͜ͱ΋͋Δ

Slide 29

Slide 29 text

Go GenericsͰग़དྷͳ͍͜ͱ • ܕม਺ͷᐆດԽ • ͨͱ͑͹ɺJavaͰ͍͏ͱ͜Ζͷ Y Έ͍ͨͳ͜ͱ͸Ͱ͖ͳ͍ • ෦෼ಛघԽ • ͨͱ͑͹ɺܕ͕intͰ͋Δͱ͖͸͜ͷఆٛΛ࢖͏Έ͍ͨͳ͜ͱ͸Ͱ͖ͳ͍ • ܕม਺ΛՄม௕Ͱड͚෇͚Δ • ͨͱ͑͹ɺC++Ͱ͍͏ͱ͜Ζͷ template ͸Ͱ͖ͳ͍

Slide 30

Slide 30 text

Go GenericsͰग़དྷͳ͍͜ͱ • ܕม਺Λ࢖ͬͨΦʔόʔϩʔυ • Φʔόʔϩʔυ͕ͦ΋ͦ΋Ͱ͖ͳ͍ • ܕม਺ͷܭࢉ • ͨͱ͑͹ɺC++ TemplateͰ͍͏ͱ͜Ζͷ typ ͸Ͱ͖ͳ͍ • ఆ਺Λܕม਺ʹ͍ΕΔ • ͨͱ͑͹ɺC++ TemplateͰ͍͏ͱ͜Ζͷ typ<1> ͸Ͱ͖ͳ͍ • C++Ͱ͍͏ͱ͜ΖͷTemplate Meta ProgrammingΈ͍ͨͳ͜ͱ

Slide 31

Slide 31 text

Go GenericsͰग़དྷͳ͍͜ͱ • ϝιουͰܕม਺Λ࣋ͭ͜ͱ͸Ͱ͖ͳ͍ • e.g.) func (x *X) foo[Y any](...) ... {...} // ίϯύΠϧΤϥʔ • e.g.) func (x *X[Y]) foo(...) ... {...} // ͜Ε͸OK • ܕม਺Λ࣋ͭؔ਺ͷͳ͔ͰܕΛఆٛ͢Δ͜ͱ͸Ͱ͖ͳ͍ • e.g.) func foo[T any](v T) { type empty struct{} } // ίϯύΠϧΤϥʔ • ͦͷ΄͔ࡉʑͱͨ͠Ͱ͖ͳ͍͜ͱ͸ଟʑ

Slide 32

Slide 32 text

࣮༻ྫ

Slide 33

Slide 33 text

ར༻ྫ • ४ඪ४ܥ • golang.org/x/exp/slices • golang.org/x/exp/maps • OSS • github.com/samber/lo • github.com/Code-Hex/go-generics-cache • github.com/moznion/go-optional

Slide 34

Slide 34 text

golang.org/x/exp/slices

Slide 35

Slide 35 text

golang.org/x/exp/slices https://cs.opensource.google/go/x/exp/+/3c43f8ba:slices/slices.go;l=127

Slide 36

Slide 36 text

golang.org/x/exp/slices https://cs.opensource.google/go/x/exp/+/3c43f8ba:slices/slices.go;l=127

Slide 37

Slide 37 text

golang.org/x/exp/slices https://cs.opensource.google/go/x/exp/+/3c43f8ba:slices/slices.go;l=127

Slide 38

Slide 38 text

ίπΛ͔ͭΊ͹؆୯ʂ

Slide 39

Slide 39 text

Go GenericsͰ΍Δ΂͖Ͱ͸ͳ͍͜ͱ • interfaceͰे෼ͳ৔໘ͰGenericsΛ࢖͏ • ίʔυͱΞηϯϒϦ͕ແବʹෳࡶʹͳΔ͚ͩ • ΄͔͸ಛʹແ͍ؾ͕͢Δ • ΍Δ΂͖Ͱͳ͍͜ͱ͸େ֓Ͱ͖ͳ͘ͳ͍ͬͯΔ

Slide 40

Slide 40 text

࣮ࡍʹͲͷΑ͏ͳ৔໘Ͱ࢖͏͔ • ڧ੍ΩϟετΛݮΒ͍ͨ͠ • ڧ੍ΩϟετΛߦ͏Ұ࿈ͷྲྀΕΛGenericsΛ࢖ͬͯڞ௨ͷఆٛʹͨ͠Γ • ϥΠϒϥϦͷ൚༻Խ • ͨͱ͑͹ɺίϯςφܕͷΑ͏ͳ΋ͷͰanyʹ͍ͯͨ͠ͷΛஔ͖׵͑ͨΓ౳

Slide 41

Slide 41 text

·ͱΊ

Slide 42

Slide 42 text

·ͱΊ • GoͷGenerics΋ଞͷݴޠͷGenericsͱಉ༷ʹಛ৭͕͋Δ • ಛ௃Λཧղͯ͠࢖͑͹ڧྗͳ෢ثʹͳΔ • ༻๏༻ྔΛཧղͯ͠ਖ਼͘͠࢖͓͏ • ConstraintͱUnderlyng TypeΛཧղ͢ΔͱΑΓ࢖͍͜ͳͤΔ • Constraintͷࢦఆ࣍ୈͰ༷ʑͳ͜ͱ͕Ͱ͖Δ • anyҎ֎ͷConstraintΛࢦఆͰ͖ͳ͍͔ߟ͑ͯ࢖͓͏

Slide 43

Slide 43 text

Go Genericsͷ͜Ε͔Β • ·ͩ·ͩൃల్্ • ඪ४ϥΠϒϥϦͷมߋ͸࣍ظϝδϟʔΞοϓσʔτ(Go2)ͰߦΘΕΔ • ͪΐͬͱࠔΔ੍໿΋͋ΔͷͰͲ͜·Ͱ؇࿨͞ΕΔ͔ • ༨༟͕͋Ε͹Go։ൃνʔϜʹʹϑΟʔυόοΫ͠Α͏ • https://github.com/golang/go/discussions?discussions_q=generics • SNSͰͭͿ΍͚ͩ͘Ͱ΋͠ͳ͍ΑΓϚγ