Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【Go言語】イテレータ
Search
Tomoki Ota
September 11, 2024
Programming
0
30
【Go言語】イテレータ
Go1.23から追加されたイテレータについて解説しています。
今後増量予定。
Tomoki Ota
September 11, 2024
Tweet
Share
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
40
アーキテクチャとビジネスロジック
tomo1227
0
44
【Go言語】テスト
tomo1227
0
22
【Go言語】クロージャ
tomo1227
0
210
【Go言語】エラーハンドリング
tomo1227
0
33
AIに淘汰されないようにするには?
tomo1227
0
30
【Go言語】range
tomo1227
0
21
【Go言語】break
tomo1227
0
33
【Go言語】反復処理
tomo1227
0
18
Other Decks in Programming
See All in Programming
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
710
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
120
Software Architecture
hschwentner
6
2.1k
Immutable ActiveRecord
megane42
0
140
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
250
『品質』という言葉が嫌いな理由
korimu
0
160
dbt Pythonモデルで実現するSnowflake活用術
trsnium
0
150
2024年のWebフロントエンドのふりかえりと2025年
sakito
2
250
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
780
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
100
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
0
140
時計仕掛けのCompose
mkeeda
1
300
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
What's in a price? How to price your products and services
michaelherold
244
12k
Statistics for Hackers
jakevdp
797
220k
Speed Design
sergeychernyshev
27
790
Site-Speed That Sticks
csswizardry
4
380
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
Documentation Writing (for coders)
carmenintech
67
4.6k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
GraphQLとの向き合い方2022年版
quramy
44
13k
Become a Pro
speakerdeck
PRO
26
5.1k
Transcript
Tomoki Ota ʲGoݴޠʳΠςϨʔλ
ΠςϨʔλͱʁ ֎෦ΠςϨʔλ&෦ΠςϨʔλ Iteratorύλʔϯ Visitorύλʔϯ δΣωϨʔλ GoͷΠςϨʔλ ΞδΣϯμ 2
ΠςϨʔλͱʁ
ΠςϨʔλͱʁ 4 ΠςϨʔλ(෮ࢠ) : σʔλू߹ͷཁૉʹॱ൪ʹΞΫηε͢ΔͨΊͷΈ
ΠςϨʔλͱʁ 5 ίϨΫγϣϯͷཁૉͷྻڍɾ෮ͷํ๏ʹɺ2ͭͷํ͕ࣜ͋Δɻ •෦ΠςϨʔλ •֎෦ΠςϨʔλ
֎෦ΠςϨʔλ&෦ΠςϨʔλ
֎෦ΠςϨʔλ 7 ίϯςφͷཁૉΛॱʹऔΓग़ͨ͢ΊͷผͷΦϒδΣΫτΛ༻ҙ͢Δํࣜ(Java, C++ͳͲ) ίϯςφͷཁૉΛॱʹऔΓग़ͨ͢ΊͷผͷΦϒδΣΫτΛΠςϨʔλ(Χʔιϧ)ͱݺͿɻ •࣮͕͍͠ •ίʔυ͕ෳࡶ •ෳͷίϯςφ͔ΒҰͭͣͭཁૉΛऔΓग़͠ ฒߦʹॲཧ͢ΔΑ͏ͳखଓ͖͕ಘҙ
෦ΠςϨʔλ 8 ݸʑͷཁૉ͝ͱͷॲཧΛදݱ͢ΔͷΛίϯςφɾΦϒδΣΫτͷϝιουʹ͠ɼ ϝιου͕ཁૉ͝ͱͷॲཧΛݺͼฦ͢λΠϓͷ܁Γฦ͠ํࣜ(RubyͳͲ) • ͏ͷ࡞Δͷ؆୯ • Ϋϩʔδϟ͕ͳ͍ͱϧʔϓຊମͱ֎ଆͱͰใΛڞ༗͢ΔͨΊʹ ͕ඞཁʹͳΔͷͰɺ͍উख͕ѱ͘ͳΔɻ
Itaratorύλʔϯ
Itaratorύλʔϯ 10 GoFʹΑͬͯఆٛ͞ΕͨσβΠϯύλʔϯͷ1ͭɻ ΠςϨʔλΛ༻͢Δ͜ͱͰɺϦετɺ ελοΫɺ πϦʔͳͲͷ ࣮ࡍͷσʔλߏΛҙࣝͤͣʹɺཁૉΛ୳ࡧ͢Δ͜ͱ͕Ͱ͖Δɻ
Itaratorύλʔϯ 11 ந ۩
ItaratorύλʔϯͷϝϦοτ 12 • ୯Ұͷݪଇɻ ͔͞Δ୳ࡧΞϧΰϦζϜΛผΫϥεʹநग़͢Δ͜ͱʹΑΓ ΫϥΠΞϯτɾίʔυͱίϨΫγϣϯͷཧ͕Մೳ • ΦʔϓϯɾΫϩʔζυͷݪଇɻ ৽͍͠छྨͷίϨΫγϣϯͱΠςϨʔλʔΛ࣮͠ طଘͷίʔυʹͳ͘͢͜ͱ͕Մೳ
• ֤ΠςϨʔλʔɾΦϒδΣΫτ͕ࣗͷ෮ঢ়ଶΛ͍࣋ͬͯΔͨΊ ಉ͡ίϨΫγϣϯΛฏߦͯ͠෮Մೳ • ಉ͡ཧ༝Ͱɺ ෮ΛҰ࣌தஅͯ͠ඞཁͳ࣌ʹ࠶։͢Δ͜ͱ͕Մೳ
ItaratorύλʔϯͷϝϦοτ 13 •ΞϓϦ͕୯७ͳίϨΫγϣϯͱͷΈಈ࡞͢Δ߹ ͜ͷύλʔϯͷద༻ͳՄೳੑ͕͋Δ •ಛఆͷಛघͳίϨΫγϣϯͷ߹ɺ ΠςϨʔλʔͷ༻ ཁૉΛݟͯߦ͘ΑΓඇޮͳՄೳੑ͕͋Δ
Visitorύλʔϯ
Itaratorύλʔϯ v.s Visitorύλʔϯ 15 Itaratorύλʔϯ : ίϨΫγϣϯͷཁૉʹॱʹ̍ͭͣͭΞΫηε͢Δ Visitorύλʔϯ : ίϨΫγϣϯͷཁૉΛ̍ͭ̍ͭ८ͬͯɺԿΒ͔ͷॲཧΛ
ߦ͍ͬͯ͘
Itaratorύλʔϯ v.s Visitorύλʔϯ 16
δΣωϨʔλ
δΣωϨʔλͱ 18 ΠςϨʔλΛ؆୯ʹ࡞Δ͜ͱ͕Ͱ͖ΔɻΠςϨʔλΛฦؔ͢ δΣωϨʔλؔͱ͍͏ɻ ·ͨɺδΣωϨʔλؔͰ࡞͞ΕͨΠςϨʔλͷ͜ͱΛ δΣωϨʔλͱݺͿ͜ͱ͋Δɻ
GoͷΠςϨʔλ
range over int
range over int 21 Go1.22Ҏ߱ Go1.22Ҏલ
range over func
range over func 23 GoͷΠςϨʔλͷσϑΝΫτελϯμʔυ
v1.23ҎલͷΠςϨʔλ 24 database/sql.Rows archive/tar.Reader.Next
range over func 25 ҎԼͷγάωνϟͷؔΛrangeͰ෮ॲཧͰ͖Δɻ
range over func 26
range over func 27 rangeͰyieldΛ༻͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨɻ
GoͷΠςϨʔλ 28 • Push(ඪ४)ΠςϨʔλ : 1ͭͣͭσʔλΛ͢ • PullΠςϨʔλ : 1ͭͣͭσʔλΛड͚औΔ
func(func()bool) 29
30 func(func(V)bool)
func(func(K, V)bool) 31
iterύοέʔδ
iterύοέʔδ 33 https://github.com/golang/go/tree/go1.23.0/src/iter 1.23ͰՃ͞Εͨ
PushΠςϨʔλ 34
PushΠςϨʔλ 35
PushΠςϨʔλ 36 iter.Seq ͷ༰Λશͯը໘ʹදࣔ͢Δྫ
PushΠςϨʔλ 37
PushΠςϨʔλ 38
PullΠςϨʔλ 39
PullΠςϨʔλ 40 • PushܕͷΠςϨʔλΛPullܕʹม͢Δ • next ΠςϨʔλͷ࣍ͷͱɺ༗ޮͳ͕͋Δ͔Ͳ͏͔ͷਅِΛฦ͢ • stop ΠςϨʔλΛऴྃͤ͞Δ
• stop Λݺͼग़ͨ͠ޙɺnext ͔Βθϩͱfalse͕ৗʹฦΔ
PullΠςϨʔλ 41
ඪ४Ξμϓλؔ
Adapter 43 ͷγʔέϯεΛϑΟϧλʔͯ͠৽͍͠γʔέϯεΛฦؔ͢
Adapter 44