Goのお勉強メモ。
今回はインターフェースについて。
Goのインターフェース
構造体の一種で、関数の実装を行わないものを指す。
「interface」識別子を使って定義する。
関数の引数と戻り値だけ定義する。
type TestInterface interface { GetStr() string }
実装
C++とかのようにインターフェースを継承する必要は無い。
インターフェースと同じ関数を定義する事で、そのインターフェース型に構造体のインスタンスを代入できる。
type Test1 Struct { } func (t Test1) GetStr() string { return "test 1" } type Test2 Struct { } func (t Test2) GetStr() string { return "test 2" } func main() { var test1 Test1 var test2 Test2 var testin TestInterface testin = test1 fmt.Println(testin.GetStr()) // test 1 testin = test2 fmt.Println(testin.GetStr()) // test 2 }
実装した構造体が明示的にどのインターフェースを継承しているのかが分かりにくいような気がする。
インターフェースを最初に用意する必要がなく、あとから定義できるってのが利点らしい。
空インターフェース
関数定義を持たないインターフェース。
var kara interface {} // なんでも代入できる kara = "test" kara = 12345
インターフェースの埋め込み
構造体と同様に、インターフェースにインターフェースを埋め込むことが出来る。
インターフェースが派生してくと、コードとしては分かりずらさ満載になっていきそうではあるが。
type Test1 interface{ } type Test2 interface{ } // インターフェースの埋め込み type Test3 interface{ Test1 Test2 }
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2015/07/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る