Slide 1

Slide 1 text

Tomoki Ota ʲGoݴޠʳΠςϨʔλ

Slide 2

Slide 2 text

ΠςϨʔλͱ͸ʁ ֎෦ΠςϨʔλ&಺෦ΠςϨʔλ Iteratorύλʔϯ Visitorύλʔϯ δΣωϨʔλ GoͷΠςϨʔλ ΞδΣϯμ 2

Slide 3

Slide 3 text

ΠςϨʔλͱ͸ʁ

Slide 4

Slide 4 text

ΠςϨʔλͱ͸ʁ 4 ΠςϨʔλ(൓෮ࢠ) : σʔλू߹ͷཁૉʹॱ൪ʹΞΫηε͢ΔͨΊͷ࢓૊Έ

Slide 5

Slide 5 text

ΠςϨʔλͱ͸ʁ 5 ίϨΫγϣϯͷཁૉͷྻڍɾ൓෮ͷํ๏ʹ͸ɺ2ͭͷํ͕ࣜ͋Δɻ •಺෦ΠςϨʔλ •֎෦ΠςϨʔλ

Slide 6

Slide 6 text

֎෦ΠςϨʔλ&಺෦ΠςϨʔλ

Slide 7

Slide 7 text

֎෦ΠςϨʔλ 7 ίϯςφͷཁૉΛॱʹऔΓग़ͨ͢ΊͷผͷΦϒδΣΫτΛ༻ҙ͢Δํࣜ(Java, C++ͳͲ) ίϯςφͷཁૉΛॱʹऔΓग़ͨ͢ΊͷผͷΦϒδΣΫτΛΠςϨʔλ(Χʔιϧ)ͱݺͿɻ •࣮૷͕೉͍͠ •ίʔυ͕ෳࡶ •ෳ਺ͷίϯςφ͔ΒҰͭͣͭཁૉΛऔΓग़͠ ฒߦʹॲཧ͢ΔΑ͏ͳखଓ͖͕ಘҙ

Slide 8

Slide 8 text

಺෦ΠςϨʔλ 8 ݸʑͷཁૉ͝ͱͷॲཧΛදݱ͢Δ΋ͷΛίϯςφɾΦϒδΣΫτͷϝιουʹ౉͠ɼ ϝιου͕ཁૉ͝ͱͷॲཧΛݺͼฦ͢λΠϓͷ܁Γฦ͠ํࣜ(RubyͳͲ) • ࢖͏ͷ΋࡞Δͷ΋؆୯ • Ϋϩʔδϟ͕ͳ͍ͱϧʔϓຊମͱ֎ଆͱͰ৘ใΛڞ༗͢ΔͨΊʹ ޻෉͕ඞཁʹͳΔͷͰɺ࢖͍উख͕ѱ͘ͳΔɻ

Slide 9

Slide 9 text

Itaratorύλʔϯ

Slide 10

Slide 10 text

Itaratorύλʔϯ 10 GoFʹΑͬͯఆٛ͞ΕͨσβΠϯύλʔϯͷ1ͭɻ ΠςϨʔλΛ࢖༻͢Δ͜ͱͰɺϦετɺ ελοΫɺ πϦʔͳͲͷ ࣮ࡍͷσʔλߏ଄ΛҙࣝͤͣʹɺཁૉΛ୳ࡧ͢Δ͜ͱ͕Ͱ͖Δɻ

Slide 11

Slide 11 text

Itaratorύλʔϯ 11 ந৅ ۩৅

Slide 12

Slide 12 text

ItaratorύλʔϯͷϝϦοτ 12 • ୯Ұ੹೚ͷݪଇɻ ͔͞͹Δ୳ࡧΞϧΰϦζϜΛผΫϥεʹநग़͢Δ͜ͱʹΑΓ ΫϥΠΞϯτɾίʔυͱίϨΫγϣϯͷ੔ཧ੔಴͕Մೳ • ΦʔϓϯɾΫϩʔζυͷݪଇɻ ৽͍͠छྨͷίϨΫγϣϯͱΠςϨʔλʔΛ࣮૷͠ طଘͷίʔυʹ໰୊ͳ͘౉͢͜ͱ͕Մೳ • ֤ΠςϨʔλʔɾΦϒδΣΫτ͕ࣗ਎ͷ൓෮ঢ়ଶΛ͍࣋ͬͯΔͨΊ ಉ͡ίϨΫγϣϯΛฏߦͯ͠൓෮Մೳ • ಉ͡ཧ༝Ͱɺ ൓෮ΛҰ࣌தஅͯ͠ඞཁͳ࣌ʹ࠶։͢Δ͜ͱ͕Մೳ

Slide 13

Slide 13 text

ItaratorύλʔϯͷϝϦοτ 13 •ΞϓϦ͕୯७ͳίϨΫγϣϯͱͷΈಈ࡞͢Δ৔߹ ͜ͷύλʔϯͷద༻͸৑௕ͳՄೳੑ͕͋Δ •ಛఆͷಛघͳίϨΫγϣϯͷ৔߹ɺ ΠςϨʔλʔͷ࢖༻͸ ཁૉΛ௚઀ݟͯߦ͘ΑΓ΋ඇޮ཰ͳՄೳੑ͕͋Δ

Slide 14

Slide 14 text

Visitorύλʔϯ

Slide 15

Slide 15 text

Itaratorύλʔϯ v.s Visitorύλʔϯ 15 Itaratorύλʔϯ : ίϨΫγϣϯͷཁૉʹॱʹ̍ͭͣͭΞΫηε͢Δ Visitorύλʔϯ : ίϨΫγϣϯͷཁૉΛ̍ͭ̍ͭ८ͬͯɺԿΒ͔ͷॲཧΛ ߦ͍ͬͯ͘

Slide 16

Slide 16 text

Itaratorύλʔϯ v.s Visitorύλʔϯ 16

Slide 17

Slide 17 text

δΣωϨʔλ

Slide 18

Slide 18 text

δΣωϨʔλͱ͸ 18 ΠςϨʔλΛ؆୯ʹ࡞Δ͜ͱ͕Ͱ͖ΔɻΠςϨʔλΛฦؔ͢਺ δΣωϨʔλؔ਺ͱ΋͍͏ɻ ·ͨɺδΣωϨʔλؔ਺Ͱ࡞੒͞ΕͨΠςϨʔλͷ͜ͱΛ δΣωϨʔλͱݺͿ͜ͱ΋͋Δɻ

Slide 19

Slide 19 text

GoͷΠςϨʔλ

Slide 20

Slide 20 text

range over int

Slide 21

Slide 21 text

range over int 21 Go1.22Ҏ߱ Go1.22Ҏલ

Slide 22

Slide 22 text

range over func

Slide 23

Slide 23 text

range over func 23 GoͷΠςϨʔλͷσϑΝΫτελϯμʔυ

Slide 24

Slide 24 text

v1.23ҎલͷΠςϨʔλ 24 database/sql.Rows archive/tar.Reader.Next

Slide 25

Slide 25 text

range over func 25 ҎԼͷγάωνϟͷؔ਺ΛrangeͰ൓෮ॲཧͰ͖Δɻ

Slide 26

Slide 26 text

range over func 26

Slide 27

Slide 27 text

range over func 27 rangeͰyieldΛ࢖༻͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨɻ

Slide 28

Slide 28 text

GoͷΠςϨʔλ 28 • Push(ඪ४)ΠςϨʔλ : 1ͭͣͭσʔλΛ౉͢ • PullΠςϨʔλ : 1ͭͣͭσʔλΛड͚औΔ

Slide 29

Slide 29 text

func(func()bool) 29

Slide 30

Slide 30 text

30 func(func(V)bool)

Slide 31

Slide 31 text

func(func(K, V)bool) 31

Slide 32

Slide 32 text

iterύοέʔδ

Slide 33

Slide 33 text

iterύοέʔδ 33 https://github.com/golang/go/tree/go1.23.0/src/iter 1.23Ͱ௥Ճ͞Εͨ

Slide 34

Slide 34 text

PushΠςϨʔλ 34

Slide 35

Slide 35 text

PushΠςϨʔλ 35

Slide 36

Slide 36 text

PushΠςϨʔλ 36 iter.Seq ͷ಺༰Λશͯը໘ʹදࣔ͢Δྫ

Slide 37

Slide 37 text

PushΠςϨʔλ 37

Slide 38

Slide 38 text

PushΠςϨʔλ 38

Slide 39

Slide 39 text

PullΠςϨʔλ 39

Slide 40

Slide 40 text

PullΠςϨʔλ 40 • PushܕͷΠςϨʔλΛPullܕʹม׵͢Δ • next ͸ΠςϨʔλͷ࣍ͷ஋ͱɺ༗ޮͳ஋͕͋Δ͔Ͳ͏͔ͷਅِ஋Λฦ͢ • stop ͸ΠςϨʔλΛऴྃͤ͞Δ • stop Λݺͼग़ͨ͠ޙɺnext ͔Β͸θϩ஋ͱfalse͕ৗʹฦΔ

Slide 41

Slide 41 text

PullΠςϨʔλ 41

Slide 42

Slide 42 text

ඪ४Ξμϓλؔ਺

Slide 43

Slide 43 text

Adapter 43 ஋ͷγʔέϯεΛϑΟϧλʔͯ͠৽͍͠γʔέϯεΛฦؔ͢਺

Slide 44

Slide 44 text

Adapter 44