Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 extends X> Έ͍ͨͳ͜ͱͰ͖ͳ͍ • ෦ಛघԽ • ͨͱ͑ɺܕ͕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ͰͭͿ͚ͩ͘Ͱ͠ͳ͍ΑΓϚγ