Go言語_インターフェース

インターフェースとは

Go言語におけるインターフェイスとは、メソッドの型だけを定義した型です。

インターフェイスはメソッドのまとまりであり、インターフェイスを通してオブジェクトの振る舞いを定義することが可能です。

つまり、インターフェースを利用することは、オブジェクト志向におけるポリモーフィズムを実現することになります。


インターフェースの利用方法

インターフェイスを定義する。

typeの後ろに型名記述してinterfaceキーワードを書きます。


type <型名> interface {
    メソッド名(引数の型, ...) (返り値の型, ...)
    ...
}

メソッドの登録

インターフェイスにメソッドを登録します。

Go言語_メソッドを参照して下さい。


実装例

Gender()関数により性別を答えるプログラムです。


package main

import "fmt"

// インターフェイスの定義
type Human interface {
	AnswerGender()
}

//構造体の定義
type Male struct{}
type Female struct{}

//メソッドの定義
func (male *Male) AnswerGender() {
	fmt.Println("男性です")
}

func (female *Female) AnswerGender() {
	fmt.Println("女性です")
}

func Gender(human Human) {
	fmt.Print("性別は : ")
	human.AnswerGender()
}

func main() {
	male := new(Male)
	female := new(Female)

	Gender(male)
	Gender(female)
}

空インタフェースと型アサーション

空インタフェース

Go 言語では「空インターフェース」というメソッドの定義がないインターフェースが用意されています。

空インターフェース利用すると、「どんな型も引数に取ることができる関数」や、「どんな型も返すことができる関数」を作ることが出来ます。

空インターフェースは「interface{}型」として定義します。


interface{}

型アサーション

空インターフェースは、振る舞いを要求しないため、そのままではメンバメソッドの呼び出しやメンバ変数へのアクセスをすることが出来ません。

これを解決するためには、空インターフェースの型と明示して扱う必要があります。

そのために、Go言語には型アサーションが用意されています。


型アサーションの構文は以下の通りです。

「x」はインターフェース型の変数で、Tが型となります。


value, ok := x.(T)

実装例

型アサーションを用いて、第三の性別を判定する処理を行います。


package main

import "fmt"

// インターフェイスの定義
type Human interface {
	AnswerGender()
}

//構造体の定義
type Male struct{}
type Female struct{}
type Custom struct{}

//メソッドの定義
func (male *Male) AnswerGender() {
	fmt.Println("男性です")
}

func (female *Female) AnswerGender() {
	fmt.Println("女性です")
}

func Gender(gender interface{}) {
	fmt.Print("性別は : ")
	identify, ok := gender.(Human)
	if !ok {
		fmt.Println("第三の性です。")
		return
	}
	identify.AnswerGender()
}

func main() {
	male := new(Male)
	female := new(Female)
	custom := new(Custom)

	Gender(male)
	Gender(female)
	Gender(custom)
}


関連ページ