それでも私はContextに値を詰めたい | Go Conference 2025 / go conference 2025 fill context
by
Yoichiro Shimizu
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
© LayerX Inc. それでも私はContextに値を詰めたい 2025/09/28 Go Conference 2025 @budougumi0617 / LayerX
Slide 2
Slide 2 text
主にWebサービスにおける リクエストコンテキストの話をします
Slide 3
Slide 3 text
📝おさらい
Slide 4
Slide 4 text
© LayerX Inc. 4 出⼒はどうなる?
Slide 5
Slide 5 text
© LayerX Inc. 5 ● それはそう ⼦(呼び出し先)のWithValueは親(呼び出し元)から⾒えない
Slide 6
Slide 6 text
Webサーバあるある
Slide 7
Slide 7 text
© LayerX Inc. 7 ● 会社IDやユーザーIDをリクエストのログに付与しておきたい Webサーバあるある
Slide 8
Slide 8 text
© LayerX Inc. 8 よくあるパターン: 認証ミドルウェア‧リクエストログミドルウェア
Slide 9
Slide 9 text
🤔困るとき
Slide 10
Slide 10 text
© LayerX Inc. 10 ● GoでクレジットカードやETCカードを作ってます! 突然ですがお仕事紹介
Slide 11
Slide 11 text
© LayerX Inc. 11 ● ⾃社の認証情報が⼊っていないリクエストを処理する ● クレジットカードで決済があったとき ○ 💳 外部決済システム → 🧾決済リクエスト → ⾃社サーバ ● 利⽤料のお⽀払い(⼝座振替情報) ○ 🏦 外部⾦融機関 → 💰⼊⾦リクエスト → ⾃社サーバ(消込) そうなるとこう
Slide 12
Slide 12 text
© LayerX Inc. 12 ビジネスロジックの中で会社を特定しかない
Slide 13
Slide 13 text
© LayerX Inc. 13 ● それはそう 再掲: ⼦のWithValueは親から⾒えない
Slide 14
Slide 14 text
© LayerX Inc. 14 これがやりたい
Slide 15
Slide 15 text
© LayerX Inc. 15 ● デコレータパターンで伝播する ● contextオブジェクトにポインタ構造体を詰める 親のcontextにデータを詰める(渡す)アイデア
Slide 16
Slide 16 text
© LayerX Inc. 16 ● Setterを追加したハコを親から渡しておく デコレータパターンで伝播する
Slide 17
Slide 17 text
© LayerX Inc. 17 デコレータパターンで伝播する
Slide 18
Slide 18 text
© LayerX Inc. 18 デコレータパターンで伝播する
Slide 19
Slide 19 text
© LayerX Inc. 19 デコレータパターンで伝播する デコレータ🐭 「http.ResponseWriter (を満たす実装)です!」 コンパイラ🤖 「よし通れ!」 例: func(w http.ResponseWriter, r *http.Request)の場合
Slide 20
Slide 20 text
© LayerX Inc. 20 👍 Pros ● そんなに悪いことしていない(はず) ● フレームワーク越しでも使える 👎 Cons ● IFがインターフェースじゃないと難しい ● contextに直接詰められているわけではない ○ http.ResponseWriterなどをビジネスロジックまで 引き回すことはあまりない(?) デコレータパターンで伝播する
Slide 21
Slide 21 text
© LayerX Inc. 21 ● 親が参照しているオブジェクトのフィールドを⼦で編集する contextオブジェクトに構造体ポインタ(アドレス)を詰める
Slide 22
Slide 22 text
© LayerX Inc. 22 contextオブジェクトにポインタ構造体を詰める
Slide 23
Slide 23 text
© LayerX Inc. 23 contextオブジェクトにポインタ構造体を詰める ポインタの先にある構造体フィールドは⼦から編集できる
Slide 24
Slide 24 text
© LayerX Inc. 24 👍 Pros ● メソッドシグネチャに影響せず、透過的に使える 👎 Cons ● 多⽤すると無法地帯になる ○ 親からするとどのタイミングで詰め込まれたのかわからない ● ⾮同期処理が絡むならMutexなどの検討が必要 contextオブジェクトにポインタ構造体を詰める
Slide 25
Slide 25 text
© LayerX Inc. 25 親コンテキストにどうしても情報を詰めたいとき ● デコレータパターンで伝播する ● contextオブジェクトにポインタ構造体を詰める ⚠ ⽤法⽤量を守って正しくお使いください(親に渡すのは最終⼿段!) まとめ