さんごー日記。

映画や本やゲームの感想をゆるく記録したり、プログラミングの勉強をゆるく記録するゆるい日記です。

Go(プログラミング言語)メモ:インターフェース

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
}


改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語