Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

GO インターフェイス

GO言語のとっかかりの習得には The Go Playground(https://go.dev/play/) を使うのがお手軽です。

GO インターフェイス

copy

package main

import "fmt"

//M() C() を対象にすると宣言するインターフェイス型 I を定義します。
type I interface {
    M()
    C()
}

type T struct {
    S string
    L int
}

//型 T がインターフェイス I を実装することを意味します。
//そうすることを明示的に宣言する必要はありません。
func (t T) M() {
    fmt.Println(t.S)
}

func (t T) C() {
    t.L = t.L +10
    fmt.Println(t.L)
}

func main() {
    A := T{
        "hello",
        10,
    }
    var i I = A
    i.M()
    i.C()
}

インターフェイスの実装には次のことが必要なようです。

構造体にメソッド M() C() を付加します。
func (t T) M() {
fmt.Println(t.S)
}

func (t T) C() {
t.L = t.L +10
fmt.Println(t.L)
}

インターフェイス型 I を定義します。
type I interface {
M()
C()
}

構造体を作成してインターフェイスにセットします。
A := T{
“hello”,
10,
}
var i I = A

The Go Playgroundのホームページで実行してみます。

期待した通りになりました。

確認

インターフェイス型 I から M() を落としたインターフェイス型 II を作り、同じようにしてみます。

copy

package main

import "fmt"

type I interface {
	M()
	C()
}

type II interface {
	C()
}

type T struct {
	S string
	L int
}

func (t T) M() {
	fmt.Println(t.S)
}

func (t T) C() {
	t.L = t.L + 10
	fmt.Println(t.L)
}

func main() {
	A := T{
		"hello",
		10,
	}
	var i I = A
	i.M()
	i.C()

	var ii II = A
	ii.M()
	ii.C()
}

インターフェイス型 II を作ります。

メソッド C() のみとします。
type II interface {
C()
}

インターフェイス型 I と同じようにThe Go Playgroundから実行してみます。

予想した通り型 II にメソッド M がないと怒られました。

私のインターフェイスのイメージ

VBAのインターフェイスの感覚からするとかなり異なりますので、理解するのに手間取りました。
この場合、GOのインターフェイスは個別の投函口を設けており、インターフェイスは構造体のメソッドに投函されたメッセージを送り構造体のメソッドが動く、投函口のないものは投函できないから弾かれるとイメージしました。
だから、インターフェイスの後ろに配置する形にしたいからインターフェイスに代入しているのだと var i I = A が理解できました。
ならば、今回は、たまたま構造体であったけどメソッドを持っている型なら何でもOKなんだと思いました。今後いろいろ確かめてみます。