interfaceの基本(Go言語)

interfaceはGo言語における唯一の抽象型だそうで、抽象型というのは実装の自由度がある訳だから使いこなせば便利でしょう。

ここでは使いこなしではなくて、基本機能の説明です。構造体のデータの操作を行う二つのメソッドを定義しています。

package main

import (
	"fmt"
)

type person struct {
	FirstName	string
	FamilyName	string
	Age			int8
}

type inf interface{
	print()
	exchange()
}

func (p *person) print(){
	fmt.Println(p.FirstName, p.FamilyName, p.Age)
}

func (p *person) exchange(){
	fn := p.FirstName
	p.FirstName = p.FamilyName
	p.FamilyName = fn
	p.print()
}

func main(){
	var i1 inf = &person{
		FirstName: "Mary",
		FamilyName: "Bloody",
		Age: 36,
	}

	i1.print()

	i1.exchange()
}

実行結果は、

Mary Bloody 36
Bloody Mary 36

Goの場合にはJavaやC#のように明示的なimplementは不要です、つまり緩い関係になってます。interfaceで定義したメソッドが全て実装されていればimplementと等価です。

じゃ『interfaceは何が良いの?』というとそれは抽象型だからというところに行き着くでしょう、何故なら実装をどう記述しようがinterfaceに規定したメソッドと同じ形(名称、引数と戻り値)であれば入れ替えできるわけで、実は明示的では無いですが継承や多態性が実現できることになります。それゆえGoにおける唯一の抽象型というのは使い方に多様性があることになります。

例えば、上の例で異なる型を扱う同名のメソッドを定義すれば、それは正しく多態性になる訳だから。

このように型によって緩やかな結合を取ることがGoの一つの大きな特徴であるように思います

P.S. (2023/1/25)

interfaceの型名は~~er(~~するもの)とするのが通例のようですから、命名規則からは外れています。

 

admin