それでも私はContextに値を詰めたい | Go Conference 2025 / go conference 2025 fill context
by
Yoichiro Shimizu
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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オブジェクトにポインタ構造体を詰める ⚠ ⽤法⽤量を守って正しくお使いください(親に渡すのは最終⼿段!) まとめ