Go Generics Overview
by
karupanerura
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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ͳͲʣ • ར༻͞Ε͍ͯΔͯ͢ͷύλʔϯΛίϯύΠϧ࣌ʹల։͢Δ • ܕফڈʢJavaType 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 typeint64 • type X int64ͱͨ͠ͱ͖ͷunderlyng typeint64 • type Y Xͱͨ͠ͱ͖ͷunderlyng typeint64 • ৄ͍͜͠ͱઌͷ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ͰͭͿ͚ͩ͘Ͱ͠ͳ͍ΑΓϚγ