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のASTを用いて フィルター機能を作ろうとした話
Search
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
monorepo.pdf
suzuito
0
340
Python on Google Cloud Functions で作るバッチ処理
suzuito
0
3.8k
Other Decks in Programming
See All in Programming
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
120
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
170
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.9k
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.1k
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
760
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
670
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
JavaDoc 再入門
nagise
1
340
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
110
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
How to Talk to Developers About Accessibility
jct
2
230
So, you think you're a good person
axbom
PRO
2
2.1k
sira's awesome portfolio website redesign presentation
elsirapls
0
280
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
210
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
190
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͍͟·ͨ͠