インターフェースのラッパーを作る際の落とし穴 / Go Conference mini 2023
by
mazrean
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
インターフェースのラッパーを 作る際の落とし⽳ 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
今度こそ完! 注: 本当です