GO言語のとっかかりの習得には The Go Playground(https://go.dev/play/) を使うのがお手軽です。
GO インターフェイス
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 を作り、同じようにしてみます。
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なんだと思いました。今後いろいろ確かめてみます。