Golangのinterfaceには大きく2通りの使い方がある
Golangにおけるinterfaceには
- 柔軟に型を入れるためのinterface
- 関数をリストアップするためのinterface
に分けられます。
それぞれの使い方について順に確認していきましょう。
柔軟に型を入れるためのinterface
空のinterface型を定義すると、どの型の値でも代入することができます。
package main
import (
"fmt"
)
func main() {
var all interface{}
all = 10
fmt.Println(all) //10 -> (int)
all = "hello world"
fmt.Println(all) //hello world -> (string)
all = true
fmt.Println(all) //true -> (bool)
}
上記のように空のinterface型の変数を定義すると、その変数にはいずれの型でも代入することができて、まるで動的型付け言語のような動作が可能となります。
interface型から元の型に戻る方法
interface型の値を元のstring型やint型などに戻すには以下のように記述します。
変数.(元の型)
以下が簡単なコード例です。
var all interface{}
all = "hello world"
str := all.(string)
fmt.Println(all) //hello world(interface型)
fmt.Println(str) //hello world(string型)
変数allがinterface型となっているので、これをall.(string)とすることで「”hello world”」本来のデータ型であるstring型の値が取得できます。
関数をリストアップするためのinterface
以下のように特定の関数を1つにまとめることができます。
type 名前 interface{
func1()
func2()
func3()
}
このように関数のリストを持ったinterface型は、同じ関数を持った構造体にしか定義できません。
type TestInterface interface{
func1()
func2()
func3()
}
type StructA struct {}
func (a *A) func1() {}
func (a *A) func2() {}
func (a *A) func3() {}
type StructB struct {}
func (a *B) func1() {}
func (a *B) func2() {}
var test TestInterface
test = StructA{} //OK
test = StructB{} //NG