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オブジェクトにポインタ構造体を詰める ⚠ ⽤法⽤量を守って正しくお使いください(親に渡すのは最終⼿段!) まとめ