インターフェースのラッパーを作る際の落とし穴 / Go Conference mini 2023
by
mazrean
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
インターフェースのラッパーを 作る際の落とし⽳ Go Conference mini 2023 @mazrean
Slide 2
Slide 2 text
mazrean 2 n東工大 修士1年 ltraP所属 nツール作るのが趣味 lISUCON13でツール作って負けた… https://trap.jp/post/2046/
Slide 3
Slide 3 text
Q. http.ResponseWriterで レスポンスサイズを計測するには? 3
Slide 4
Slide 4 text
A. embeddingを使う nResponseWriterにサイズを取り出す機能はない → ラップが必要 nインターフェースのメソッドを全て引き継ぐ → 同じ挙動に! 4
Slide 5
Slide 5 text
本当に?
Slide 6
Slide 6 text
型アサーションの挙動が変わる 6 nインターフェースに含まれないメソッドは消える nこのようなメソッドは多くある l後方互換性を保って拡張できるため lex) http.Flusher, http.Hijacker, etc
Slide 7
Slide 7 text
例) Server Sent Events 7 ラップすると型アサーションに失敗する → うまく動かなくなる!
Slide 8
Slide 8 text
解決策 8 オプショナルなメソッドも実装しましょう
Slide 9
Slide 9 text
完
Slide 10
Slide 10 text
とはならない
Slide 11
Slide 11 text
Flusherがない場合 11 nFlusherがなかった場合、panic nライブラリの場合、問題 l過去バージョンでも使われることがあるため
Slide 12
Slide 12 text
解決策: 動的に構造体構築 12 nラップ前にhttp.Flusherが実装されているか確認 n結果に応じてもう一段ラップ
Slide 13
Slide 13 text
解決策: 動的に構造体構築 13 nラップ前にhttp.Flusherが実装されているか確認 n結果に応じてもう一段ラップ
Slide 14
Slide 14 text
完!
Slide 15
Slide 15 text
いいえ、まだです
Slide 16
Slide 16 text
ケースは2!個 16 n他にも考慮すべきインターフェースは色々 lhttp.Hijacker,etc(計4個) l(database/sql/driver).Connに至っては8個 n各インターフェースで実装有無判定 → 2!ケース 自動化しよう!
Slide 17
Slide 17 text
ツール作った! 17 リポジトリ: https://github.com/mazrean/iwrapper 動的な構造体構築をする関数を自動生成する
Slide 18
Slide 18 text
今度こそ完! 注: 本当です