Lapis Lazuli

technical blog for web developer

【Go】interfaceの使い所

最近interfaceについて詳しく使う機会があったので、今回はinterfaceについて。

interfaceとは

以前もちょこっと書いたけど何でも入る型です。自分の場合はjson.Marshalするときによく使います。というかここでしか使ったことがありませんw
mapの値の型をinterface{}にするとMarshalするときに、いい感じにjson化してくれるので重宝しています。
が、これはMarshalが特殊なだけで、interface型を使うことは他ではないだろうな・・・と思ってました。
型に厳密なGoを、こんなにもゆるく扱う事がそもそもおかしいのではないかと。

実は他にも利用方法があった

interfaceとは何でも入る型という用途だけではなく、関数をまとめて定義しておけるもの、という機能もあります。
例えばこんな感じで

type XXX interface {
      func1()
      func2()
      func3()
}

ちょうど構造体のstructがinterfaceに変わったような形で定義します。
構造体と同じく、新しく定義した型のように使う事が出来ます。

それで、これの使うシーンですが。
関数をまとめておけるという点で、似たような関数を使う時とかでしょうか。
例えば、同じ関数名で型の違う構造体に定義されている場合、それぞれを定義して使いますが、interfaceを使うと同時に呼び出して使う事が出来るという感じです。

type A interface {
      func1()
      func2()
      func3()
}

type B struct {
}

type C struct {
}

func (b B) func1() {...}
func (c C) func1() {...}

//ここでinterfaceを呼び出す。Aの関数を実装したBとCの構造体があるので、同時に定義出来る。
var b, c  A

b = B{...}
c = C{...}

上記のような形で使います。
あとは型Aを引数にもった関数を定義して実行すれば、BとC、それぞれの構造体に応じた型の関数が実行されます。
なのでいちいち複数定義しておく必要がなく簡潔に賭けるという訳です。
これを使うシーン。来るのだろうか・・・もしこれと似たような場面に遭遇したときには使ってみよう。