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
lt_ai.pdf
suzuito
0
220
monorepo.pdf
suzuito
1
510
Python on Google Cloud Functions で作るバッチ処理
suzuito
0
3.8k
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
240
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
220
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
970
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
180
5分で問診!Composer セキュリティ健康診断
codmoninc
0
770
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.7k
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
1.1k
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
420
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
sira's awesome portfolio website redesign presentation
elsirapls
0
310
Six Lessons from altMBA
skipperchong
29
4.4k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
750
Building Applications with DynamoDB
mza
96
7.1k
The agentic SEO stack - context over prompts
schlessera
0
860
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Building an army of robots
kneath
306
46k
First, design no harm
axbom
PRO
2
1.2k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
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͍͟·ͨ͠