
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なんだと思いました。今後いろいろ確かめてみます。
