Slide 1

Slide 1 text

GO IN ACTION ྠಡձ 1/14 Go In Action Chapter 5 Go’s type system - 5.4 Interface (ΠϯλʔϑΣʔεܕʣ - 5.5 type embeddingʢຒΊࠐΈʣ - 5.6 Exporting and unexporting identifiersʢ֎෦ύοέʔδ͔Βͷࢀরʣ by Makoto Tano @

Slide 2

Slide 2 text

GO IN ACTION ྠಡձ 1/14 5.4 Interface

Slide 3

Slide 3 text

GO IN ACTION ྠಡձ 1/14 • ”ৼΔ෣͍”Λܕ΁ू໿͢Δ͜ͱͰGoͰ͸ϙϦϞʔϑΟζϜΛ Մೳͱ͍ͯ͠·͢ɻ • Interfaceܕͱ͸”ৼΔ෣͍”͚ͩΛఆٛͨ͠΋ͷͰ͢ɻ • “ৼΔ෣͍" ͷ಺༰͸Interfaceܕ΁௚઀ఆٛ͠·ͤΜɻ • Interfaceʹఆٛͨ͠method setΛ΋ͭϢʔβఆٛܕͷΈ Λɺ͜ͷInterfaceܕʹ୅ೖͰ͖·͢ɻ • ͜ͷΑ͏ʹInterfaceͷ༻݅Λຬͨͨ͠ϢʔβʔఆٛܕΛ concrete type ͱݺͼ·͢ɻ • https://play.golang.org/p/_eneJprgla

Slide 4

Slide 4 text

GO IN ACTION ྠಡձ 1/14 • interface஋͸̎ͭͷσʔλߏ଄͔Β੒Γཱ͍ͬͯ·͢ • ͻͱͭΊ͸ɺ iTableͱݺ͹ΕΔ಺෦ςʔϒϧ΁ͷϙΠϯλ • ;ͨͭΊ͸ɺ֨ೲ͍ͯ͠Δ஋΁ͷϙΠϯλʢ̎ʣ • iTable΋̎ͭͷσʔλߏ଄͔Β੒Γཱ͍ͬͯ·͢ • ֨ೲ͍ͯ͠Δ஋ͷܕ৘ใʢ̍ʣ • ஋ʹଐ͍ͯ͠ΔϝιουͷϦετ • ͜ͷܕ৘ใʢ̍ʣͱϙΠϯλʔʢ̎ʣ͕Interfaceͱ஋Λbind͍ͯ͠·͢ɻ Address myDog Address iTable notifier
 Interface value MyDog Stored value Method set Type(myDog) iTable var d Dog d = MyDog{“Pochi”}

Slide 5

Slide 5 text

GO IN ACTION ྠಡձ 1/14 • interface ʹ஋΍ϙΠϯλʔΛ୅ೖͨ࣌͠ɺiTableͷ৘ใ͸Ͳ ͏ͳΓ·͔͢ʁ Address myDog Address iTable notifier
 Interface value MyDog Stored value Method set Type(myDog) iTable var d Dog d = MyDog{“Pochi”} Address myDog Address iTable notifier
 Interface value MyDog Stored value Method set Type(*myDog) iTable var d Dog d = &MyDog{“Pochi”} • value assignment • pointer assignment • iTableͷܕ͸
 Reflectionͨ͠ܕΛ
 ࣋ͭ

Slide 6

Slide 6 text

GO IN ACTION ྠಡձ 1/14 • Method ͷ value ϨγʔόʔͱɺpointerϨγʔόʔͷϧʔϧ • https://play.golang.org/p/Uopo2StNfA • Method set͸ɺ༩͑ΒΕͨܕͷ஋΋͘͠͸ϙΠϯλʔͷͲͪΒ ͔ʹఆٛΛ͢Δ΋ͷ͢Δɻ • Ϩγʔόʔͷܕ͸ɺ༩͑ΒΕͨMethod͕஋ɺϙΠϯλʔɺ΋͠ ͘͸ͦͷ྆ํʹଐ͢Δ΂͖ͳͷ͔Λܾఆ͠·͢ɻ • ҎԼͷ༷ͳϧʔϧͰ͢ɻ • ઌ΄ͲͷMyCat͸PointerͰ౉ͤ͹Α͔ͬͨͱ͍͏͜ͱͰ͢
 https://play.golang.org/p/3ejDDyP37G ஋ MethodϨγʔόʔ T (t T) *T (t T) and (t *T)

Slide 7

Slide 7 text

GO IN ACTION ྠಡձ 1/14 • Method ͷ value ϨγʔόʔͱɺpointerϨγʔόʔͷϧʔϧ • ٯʹϨγʔόʔଆ͔ΒݟΔͱҎԼͷ༷ͳϧʔϧͰ͢ɻ MethodϨγʔόʔ ஋ (t T) T and *T (t *T) *T

Slide 8

Slide 8 text

GO IN ACTION ྠಡձ 1/14 • https://play.golang.org/p/d8IQIT2zSL • ͜Μͳ࿩΋ཧղͰ͖·͢Ͷɻ • ϙΠϯλϨγʔόʔ͕࣮ߦͰ͖Δ৚݅ͱ͸ • Method set͕ϙΠϯλʹଐ͍ͯ͠ΔͷͰɺϙΠϯλͱͯ͠ ΞυϨε͕औΕ͍ͯͳ͍ม਺͔Β͸ɺMethod set͕࣮ߦͰ ͖ͳ͍
 ͱ͍͏͜ͱͰ͢ɻ

Slide 9

Slide 9 text

GO IN ACTION ྠಡձ 1/14 • InterfaceΛ༻͍ͨϙϦϞʔϑΟζϜ • https://play.golang.org/p/h0leVMuJd9 • Interface͕”ৼΔ෣͍”ͱ”ॲཧ”Λ෼͚͍ͯΔͷ Ͱɺಉ͡InterfaceʹҟͳΔॲཧΛ͢ΔΦϒδΣ ΫτΛ౉͍ͯ͠Δͱɺಉ͡खଓ͖ͰҟͳΔॲཧ Λ࣮ݱͰ͖·͢ʢϙϦϞʔϑΟζϜʣ • αϥοͱͰ͍͢·ͤΜɻʢ࿩͢ΑΓίʔυͷݟ ͨ΄͏͕ૣ͍Ͱ͢ΑͶɾɾʁʣ

Slide 10

Slide 10 text

GO IN ACTION ྠಡձ 1/14 5.5 Type embedding

Slide 11

Slide 11 text

GO IN ACTION ྠಡձ 1/14 • https://github.com/goinaction/code/blob/master/chapter5/listing50/ listing50.go • ϝοηʔδ • ߏ଄ମ in ߏ଄ମ ʢຒΊࠐΈʣ͕ՄೳͰ͢ • ad.user.nortify()ͱ͍͏ܗͰຒΊࠐΜͩߏ଄ମͷMethodΛίʔϧ Ͱ͖·͢ɻ • ad.nortify() ͱ͍͏ײ͡Ͱɺ਌ͷadminߏ଄ମ΁Method͕͔͋ͨ ΋͋Δ͔ͷΑ͏ʹʢPromoteͨ͠ʣίʔϧ͢Δ͜ͱ͕Ͱ͖·͢ɻ • ʢΫϥεͰ͍͏ͱجఈΫϥεͷܧঝΈ͍ͨͳΠϝʔδͰ͢Ͷɻҙ ຯશ͘ҧ͍·͕͢ɾɾɾɻʣ

Slide 12

Slide 12 text

GO IN ACTION ྠಡձ 1/14 • ߏ଄ମA -> ߏ଄ମ B ຒΊࠐΈ·͢ • Interface `nortifier` ͕ nortify() ͱ͍͏ MethodΛ͍࣋ͬͯͯɺߏ଄ ମA΋ɺߏ଄ମB΋ nortify()ͱ͍͏ؔ਺Λ͍࣋ͬͯΔʹ concrete type ͩͱ͠·͢ɻ • func hoge(n nortifier) ʹɺߏ଄ମAΛ౉ͯ͠ɺn.nortifyʢʣΛ࣮ߦ ͢ΔͱͲ͏ͳΔͰ͠ΐ͏͔ʁ • ౴͑ɿ ߏ଄ମAͷ nortify() ͕ίʔϧ͞Ε·͢ɻ
 ʢߏ଄ମBͷnortify() ͸Promote͠·ͤΜʣ • https://play.golang.org/p/Y9eqwuspb6

Slide 13

Slide 13 text

GO IN ACTION ྠಡձ 1/14 5.6 Exporting and unexporting identifiers

Slide 14

Slide 14 text

GO IN ACTION ྠಡձ 1/14 • GoͰ͸ม਺ͷઌ಄จࣈ͕େจࣈ͔খจࣈ͔Ͱɺଞͷύοέʔδ͔ΒࢀরͰ͖ΔʗͰ͖ͳ͍ ͕ܾ·Γ·͢ɻ • ύοέʔδ͸ͦͷίʔυ͕ೖ͍ͬͯΔϑΥϧμ໊ͱಉҰʹ͢Δͷ͕Good PracticeͰ͢ɻ • Ҏ্Ͱ͢ɻʢ࠷ޙଉ੾ΕΛͨ͠ͷͰͳ͘ɺຊ౰ʹίϨҎ্ͷ಺༰͕ͳ͔ͬͨͷͰ͢ɻɻʣ • αϯϓϧ • ؔ਺ͷ֎෦ύοέʔδͷࢀর • https://github.com/goinaction/code/tree/master/chapter5/listing64 • func New() Ͱճආ͢Δ
 https://github.com/goinaction/code/tree/master/chapter5/listing68 • ߏ଄ମϑΟʔϧυͷ֎෦ύοέʔδͷࢀর • https://github.com/goinaction/code/tree/master/chapter5/listing71 • ຒΊࠐΜͩߏ଄ମϑΟʔϧυpromote ࢀর
 https://github.com/goinaction/code/tree/master/chapter5/listing74

Slide 15

Slide 15 text

GO IN ACTION ྠಡձ 1/14 END.