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
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
monorepo.pdf
suzuito
0
340
Python on Google Cloud Functions で作るバッチ処理
suzuito
0
3.8k
Other Decks in Programming
See All in Programming
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
750
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
230
スマートグラスで並列バイブコーディング
hyshu
0
140
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
2
640
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
Vite+ Unified Toolchain for the Web
naokihaba
0
300
ふつうのFeature Flag実践入門
irof
7
3.9k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
750
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Typedesign – Prime Four
hannesfritz
42
3.1k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Discover your Explorer Soul
emna__ayadi
2
1.1k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
710
Deep Space Network (abreviated)
tonyrice
0
170
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
RailsConf 2023
tenderlove
30
1.5k
Why Our Code Smells
bkeepers
PRO
340
58k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
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͍͟·ͨ͠