interface・switch/type文・ダックタイピング【夏休みにGo vol.22】

こんにちは、しーたです。
今日はinterfaceとswitch/type文について学んでいきます。


interfaceとは

interfaceとは、「なんでも入れられる型」です。
intやstringなど、任意の値を入れて、後から(intやstringに)戻すことができます。実際に2つの使い方を見ていきましょう。


interfaceの使い方① (switch/type文)

「なんでも入れられる」という性質を利用して、関数に様々な型の因数を渡すことができます。またswitch/type文を使って「型によって処理を分ける」ことができます。※switchとtypeはセットです。

"i.(int)"などとすることでinterface型からint型を宣言できます。
これを「タイプアサーション」と言います。※型変換とは区別されます。

func show(i interface{}) {
	switch v := i.(type) { //switch/type文(vはiをタイプアサーションしたもの)
	case int:
		fmt.Println(v, "is int.")
	case float64:
		fmt.Println(v, "is float64.")
	case string:
		fmt.Println(v, "is string.")
	default:
		fmt.Printf("Unavailable type : %T\n", v)
	}
}

func main() {
	show(10)
	show(12.21)
	show("Haruki")
	show(true)
}

画像1


interfaceの使い方② (ダックタイピング)

↓のようにinterfaceにメソッドを指定することで、そのメソッドを持つ型しかそのinterface型に代入できなくすることができます。

type Human interface {
	Hello() string
}

具体的に書くと次のようになります。
VScodeに貼り付ければ分かりますが、main()内のuser3の宣言の部分にエラーがでます。このように、特定のメソッドを持つstruct以外を代入できなくすることができます。

type Human interface {
	Hello() string
}

type Man struct {
	name string
}

type Woman struct {
	name string
}

type Pet struct {
	name string
}

func (p Man) Hello() string {
	return ("Hello, " + p.name + ".")
}

func (p Woman) Hello() string {
	return ("Hello, " + p.name + ".")
}

func (p Woman) Test() string {
	return ("Test, " + p.name + ".")
}

func main() {
	var user1 Human = &Man{"Hiro"}
	var user2 Human = &Woman{"Yuna"}
	var user3 Human = Pet{"Pochi"} //Hello()を持っていないのでエラーが出る
	fmt.Println(user1.Hello())
	fmt.Println(user2.Hello())
	fmt.Println(user3.Hello())
}

このようなプログラミング手法を「ダックタイピング」と呼ぶそうです。

私もしっかりとは理解できていませんが、ダックタイピングについてはこちらの記事が分かりやすかったです。
https://qiita.com/masalennon/items/ee627a6fc46be7c871ea


以上です。それでは!

いいなと思ったら応援しよう!