Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GoのASTを用いて フィルター機能を作ろうとした話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Suzu Ito
April 24, 2025
Programming
190
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoのASTを用いて フィルター機能を作ろうとした話
Suzu Ito
April 24, 2025
More Decks by Suzu Ito
See All by Suzu Ito
AI時代 DDDやってて良かったこと
suzuito
2
1.1k
lt_ai.pdf
suzuito
0
630
monorepo.pdf
suzuito
1
530
Python on Google Cloud Functions で作るバッチ処理
suzuito
0
3.8k
Other Decks in Programming
See All in Programming
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
アクセシビリティから考える情報設計
high_g_engineer
0
350
AIの中の人になってみる
htkym
0
170
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
520
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
typoなんかねぇよ
raspython3
0
680
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
220
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
180
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Featured
See All Featured
Un-Boring Meetings
codingconduct
0
410
The Art of Programming - Codeland 2020
erikaheidi
57
14k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
The Spectacular Lies of Maps
axbom
PRO
1
990
Test your architecture with Archunit
thirion
2
2.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Done Done
chrislema
186
16k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Transcript
ླ ହే GoͷASTΛ༻͍ͯ ϑΟϧλʔػೳΛ࡞Ζ͏ͱͨ͠ Go Connect #6 2025.04.24
ླ ହే / Suzuki Taito / @ts__0625 • WebΤϯδχΞ (6
• όοΫΤϯυ • GoྺGo • ݩʑσʔλΤϯδχΞͬΆ͍ (7 • ݱࡏ • WebΤϯδχΞ @גࣜձࣾHRBrain ࣗݾհ
ࣄͰϘπʹͳ͚ͬͨͲ ASTͷԠ༻ࣄྫͱͯ͠໘ന͍ (…ͱࢥ͏) ͳͥ͜ͷΛ͢Δʁ
ΞδΣϯμ GoͷASTΛ༻͍ͯϑΟϧλʔػೳΛ࡞Ζ͏ͱͨ͠ എܠ ϑΟϧλʔػೳͱ ASTΛ༻͍Δ͜ͱʹͳͬͨܦҢ ຊ ϑΟϧλʔػೳͷ࡞Γํ ৼΓฦΓ ࣗݾհ
എܠ
Γ͍ͨ͜ͱ λ ϑΟϧλ ϝοηʔδ mailૹ৴ DB λ Ϣʔβʔຖͷ ϑΟϧλઃఆ ΤϯυϢʔβʔ
ϝοηʔδ͕ྲྀΕͯ͘Δ
Γ͍ͨ͜ͱ λ DB ΤϯυϢʔβʔ ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
࣮ͷ՝() λ DB ΤϯυϢʔβʔ ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ ςΩετͷϑΟϧλʔઃఆͷύʔε Ͳ͏Δʁ ςΩετͷϑΟϧλʔઃఆͷจ๏ɻͲ͏͢Δʁ
ύʔεͨ݁͠ՌͷASTͷධՁ Ͳ͏Δʁ
;ͱʮGoͷASTʯΛࢥ͍ग़ͨ͠ ඪ४ϥΠϒϥϦ go/ast, go/parser GoݴޠͷιʔείʔυΛ੩తղੳ͢Δͱ͖ʹΘΕΔ go/ast … AST ද͢ߏମͳͲ go/parser
… ιʔείʔυ͔ࣜΒASTΛߏங͢Δύʔαʔ go/parser.ParseExpr ؔ … Goݴޠͷࣜ(Expression)͚ͩͷASTΛฦ͢ ( a + fn(1) ) * d
GoͷASTΛ͑… λ DB ΤϯυϢʔβʔ ςΩετͷϑΟϧλઃఆΛ GoͷࣜͰهड़͢Δ ςΩετͷϑΟϧλʔઃఆͷจ๏ Goݴޠͷࣜ ΦϨASTͷධՁॲཧΛ࣮͢Δ͚ͩʂ ςΩετͷϑΟϧλʔઃఆͷύʔε
ParseExprؔΛ༻͍Δ
࣮ݮΒͤͯ ໘നͦ͏😀😀
ຊ
λ DB ΤϯυϢʔβʔ ςΩετͷϑΟϧλઃఆΛ GoͷࣜͰهड़͢Δ ຊʂ
ຊ ίϨΛ Ͳ͏࡞͔ͬͨʁ ϑΟϧλʔઃఆ(Goͷࣜ) ↑࣍εϥΠυͰৄ͘͠
ϑΟϧλʔઃఆ(Goͷࣜ) ࣜͷධՁ݁Ռඞͣϒʔϧ 3ͭͷ͕ؔఆٛͯ͋͠Δ contains(a string) bool : Πϕϯτͷ༰͕ a ΛؚΉʁ
equalType(a string) bool : Πϕϯτͷछྨ͕ a Ͱ͋Δʁ equalLoc(a string) bool : Πϕϯτͷൃੜॴ͕ a Ͱ͋Δʁ &&ͱ||ͷԋࢉࢠͷΈ͕༻Մೳ ྫ equalLoc(“౦ژ৽॓۠”) && equalType(“౪ࣄ݅”) || equalLoc(“࡛ۄݝॴࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ౦ژ৽॓۠ɺ͔ͭɺ౪ࣄ݅ ·ͨ ࡛ۄݝॴࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
Filter(ev Event, setting string) bool ॲཧͷྲྀΕ (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ
(3) AST(ࣜશମ)ΛධՁ͢Δ
Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ ast/parser.ParseExpr ؔΛݺͿ͚ͩ equalLoc(“౦ژ৽॓۠”)
&& equalType(“౪ࣄ݅”) || equalLoc(“࡛ۄݝॴࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ্هͷࣜΛASTʹม͢Δͱ…ͬͯΈΔ https://go.dev/play/p/7llFDi3gdeI
Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ || && equalLoc
“౦ژ৽॓۠” equalType “౪ࣄ݅” && && equalLoc “࡛ۄݝॴࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ ͚ؔͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δ͔ؔΒ) ||
&& equalLoc “౦ژ৽॓۠” equalType “౪ࣄ݅” && && equalLoc “࡛ۄݝॴࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔΛධՁ͢Δ ͚ؔͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δ͔ؔΒ) ||
&& True False && && False True False
Filter(ev Event, setting string) bool (3) AST(ࣜશମ)ΛධՁ͢Δ ͜ͷྫͰFalse || &&
True False && && False True False
Filter(ev Event, setting string) bool ASTͷਂ͞༏ઌ୳ࡧ walk.go Walkؔ Inspectؔ
😄Θʔ͍ Πέͦ͏
ࣾͷϨϏϡʔձͰ͓൸࿐ͯ͠Έͨ݁Ռ ςοΫϦʔυͳਓA ͋Μ·Γมͳ͜ͱΒͳ͍ํ͕͍͍ͱࢥ͏ͳʂ ςοΫϦʔυͳਓB ύϑΥʔϚϯεѱͦ͏ PdMͳਓ ඇΤϯδχΞʹͱͬͯɺGoݴޠͷࣜΉ͍ͣͬ͢ PdMͳਓ ͦͦෳࡶͳݕࡧ͍݅ΒΜ
😭ܸ 🪦ιʔείʔυຒ
ʹຒΊͨιʔείʔυͪ͜Β https://github.com/suzuito/ fi lter-by-ast-go ࠓճͷઆ໌ͷͨΊʹఏࣔͨ͠ʮྫʯͱ࣮͕एׯҧͬͯ·͕͢ɺ ϕʔεͱͯ͠Δߟ͑ํಉ͡Ͱ͢ɻ ࠓճͷઆ໌ͷͨΊʹɺ5ͿΓʹಈ͔ͯ͠ΈͨΒɺͪΌΜͱಈ͍ͨ(͢͞Go)
ৼΓฦΓ
͍·ࢥ͏ɺࣗͳΓͷධՁ 👌ϝϦοτ ґଘͳ͠ɿGoͷඪ४ϥΠϒϥϦͷΈͰ࣮ՄೳͳͨΊɻ ޓੑΛอͯΔɿGoͷࣜʹ͍ͭͯɺഁյతมߋͷϦεΫ͍ͨΊɻ ASTͷධՁͷΧελϚΠζੑྑ͠ɿධՁͷ࣮ΛࣗલͰॻ͘ʹͳΜͰͰ͖Δ 👎σϝϦοτ ASTͷධՁ෦ͷ࣮͕ෳࡶ πϦʔΛ୳ࡧͨ͠ΓɺελοΫPush/PopɺGoͷશASTϊʔυͷରԠ ΧελϜؔΛݺͿॲཧɺ…
͍·ࢥ͏ɺ͍·ΔͳΒ ඇΤϯδχΞͰѻ͑ΔϑΟϧλʔઃఆͱʁ ΛͪΌΜͱߟ͑Δ with PdMͱσβΠφʔ ධՁࣜ༻ͷϥΠϒϥϦΛ͏ CEL https://cel.dev/ Open Policy
Agent https://www.openpolicyagent.org/docs/latest/ Expr https://expr-lang.org/ ϥΠϒϥϦͷత͔Β֎Ε͍ͨํΛ͠ͳ͍
🙇 Goਗ਼ௌ͋Γ͕ͱ͏Go͍͟·ͨ͠