Upgrade to Pro — share decks privately, control downloads, hide ads and more …

インターフェースのラッパーを作る際の落とし穴 / Go Conference mini 2023

mazrean
November 30, 2023

インターフェースのラッパーを作る際の落とし穴 / Go Conference mini 2023

外部ライブラリで提供されているインターフェイスをラップする際にembedded fieldが使われます。
しかし、このようにして作られたラッパーでは型アサーションの結果が変化することがあります(例: https://go.dev/play/p/slMbwUjpiHn)。
Go言語ではライブラリの後方互換性を維持するために型アサーションを使用して機能拡張を行うことがあります。
このため、型アサーション結果の変化は予期しない挙動の原因となります。
例えば、HTTPサーバーなどで利用されるインターフェースのhttp.ResponseWriterではhttp.Flusherを実装している場合のみバッファリングされたデータのフラッシュが可能になります。
このため、型アサーション結果の変化により、フラッシュの挙動に依存したServer Sent Events実装が機能しなくなるなどの危険性があります。
本セッションでは、ラップ前の実装メソッドを基に動的にラッパー構造体を構成することでこの問題を解決する手法と、それを容易に行えるようにする自作ツールiwrapperの紹介をします。

mazrean

November 30, 2023
Tweet

More Decks by mazrean

Other Decks in Programming

Transcript