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

今度こそ完! 注: 本当です