2016この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。本当はGo月Go日に書きたかったけど、ビール飲んで寝てしまったの今日(Go月6日)になりました。Goのインタフェースは、明示的に実装する必要がなく、インタフェースが定義するメソッドリストをその型が持っていれば、そのインタフェースとして振る舞えます。構造体に埋め込んだ型が持つメソッドについても、埋込み先の構造体のメソッドの一部としてみなすことができるため、インタフェースの実装の頭数に入れることができます。インタフェースの実装と埋込みの関係についてはインタフェースの実装パターンという記事に詳しく書いているのでそちらを参考にしてください。埋込みによって構造体にインタフェース実装させるパターンは思ったよりも使えます。埋込みは単なる匿名フィールドに対して、インタフェースは実装を隠し、型を抽象化ができるからです。このパターンは、共通部分を抜き出して、それを複数の型で使う場合に非常に便利です。共通部分を抜き出す場合、構造体の埋め込みを使いたくなります。以下のように*fugaをFugaに埋め込んだ場合、Fugaは*fugaのメソッドをまるで自分のメソッドのように呼び出すことができます。単なる匿名フィールドのメソッドを呼び出していることには変わりません。これらの型はあくまで別の型なので、*fuga型の変数に*Fuga型の値を入れることはできません。コンパイルエラー}しかし、インタフェースはメソッドリストさえ一致していれば、そのインタフェースとして振る舞うことができます。以下のようにインタフェースを作って埋め込んでみます。OK}こうすることにより、*Fuga型はHoge型としても振る舞うことができるようになりました。Hogeインタフェースを埋め込んだ構造体が複数ある場合は、Hoge型としてまとめて扱うことができます。普段は汎用的なインタフェース型で持っておき、必要な場合に型アサーションで実行時にインタフェースを実装しているかチェックすることもできます。h.Method()}先ほどの例だと、Hoge型が公開されてしまっているので、埋め込んだとしてもFuga.Hogeが外部パッケージから変更されてしまう可能性があります。匿名フィールドでも上書きできるそこで、Hogeインタフェースをリネームしただけのhoge型をつくって、こちらを埋め込みましょう。NewFuga()f.Method()}こうすると、hoge型の匿名フィールドは外部のパッケージに公開されず変更できなくなります。Goのインタフェースは、シンプルで強力なので使い方次第では面白いことができます。今回紹介した、インタフェースを構造体に埋め込むパターンを使えば、構造体をインタフェースでデコレートしていき、必要な時に特定のインタフェースとして振るまわせることができます。CoderPortfolio.。