🦝
[Golang] interface{}型を異なる型の関数の引数に渡す方法
結論
型アサーションを使う。
実装
引数に文字列を受け取り、標準出力する関数に対して、interface型の変数を渡してみる。
以下のようにするとエラーになる。
func main() {
var x interface{} = 1
println(x) // cannot use x (type interface {}) as type string in argument to printString: need type assertion
}
// 引数に文字列を受け取り標準出力する
func printString(s string) {
fmt.Println(s)
}
これを型アサーションを使って、実装してみる。
func main() {
var x interface{} = 1
// 型アサーション
if y, ok := x.(string); ok {
println(x);
}
}
// 引数に文字列を受け取り標準出力する
func printString(s string) {
fmt.Println(s)
}
解説
型アサーションについて少し深掘っていく。
t := i.(T)
上記のように型アサーションを行うことで、interface型のi
が具象型であるT
を保持していることを主張します。 i
がT
を保持していない場合、panicになる。
このi
がT
を保持しているか確認するために、型アサーションは2つの引数を返すことができる。
t, ok := i.(T)
okには、アサーションが可能であるかを表すboolが入る。
また、もしokがfalseになった場合には、t
にはT
のゼロ値が入ることになり、panicにはならない。
Discussion