[golang]Interfaceのオススメの使い方3 ~暗黙的な実装でカスタマイズ!~

こんにちは。KOUKIです。

とある企業でWeb系のエンジニアをしています。開発言語はGo言語です。

先日から「[golang]Interfaceのオススメの使い方」について紹介してきました。

今回は、その第三弾で、Interfaceを使って既存のメソッドを暗黙的に実装しカスタマイズする方法を紹介します。

Interfaceの基礎については、以下の記事を参考にしてください!

Interfaceの暗黙的な実装

復習ですが、Go言語ではtype XXXX interfaceにて、Interfaceを宣言できます。

そして、Interface内に宣言した関数と同じシグネチャ(名前、パラメータ、戻り値)と同じシグネチャを持つメソッドを定義するとそのInterfaceを暗黙的に実装します。

この機能を利用して、既存の処理をカスタマイズできます。
具体例をあげましょう。

io.Writerの実装

golangのioパッケージには、Writer interfaceが存在します。

このWriter interfaceは、fmtパッケージなどの出力系の関数のパラメータとしてよく実装されています。

例えば、Fprintf関数の第一パラメータはio.Writerであり、Writer interfaceを満たすインスタンスを渡す事ができます。

サンプルコードを実装します。

ByteCounterには、Writeメソッドを定義しました。これにより、Writer interfaceを暗黙的に実装します。

そのため、Fprintf関数の第一パラメータに引数として渡す事が可能になります。

fmt.Stringer

fmtパッケージのStringerインターフェースも知っていると便利です。

Stringerを暗黙的に実装するとカスタマイズした文字列を出力する事ができます。

json.Marshal/Unmarshal

ネットワーク越しに入ってきたデータをGoのStructの中に入れたり、逆にStructのデータをネットワーク越しに送信したりするときに便利なのが、jsonパッケージのMarshalとUnmarshalです。

具体的な使い方は、この記事を参照してください。

Marshalには、Marshaler Interfaceが存在します。

そして、Unmarshalには、Unmarshaler Interfaceが存在します。

MarshalJSONとUnmarshalJSONを実装したメソッドを定義すれば、既存の処理をカスタマイズできるはずです。

注意する点としては、UnmarshalJSONの場合はポインタを渡し、MarshalJSONの場合はポインタを渡さないことです。

データに不整合が生じるので注意してください。

おわりに

Interfaceを見つけたら目を光らせて、「このインターフェースの便利な使い方は何だろう?」と自問自答すると意外な使い方を発見する事ができるかもしれません。

宝探しに似ていますね。とはいえ、自分もまだ完全に使いこなせてません^^;

プログラミングは、奥が深いですよね!これからもInterfaceの便利な使い方がわかったら記事にしたいと思います。

それでは、また!

オススメ書籍

関連記事