🦝

[Golang] interface{}型を異なる型の関数の引数に渡す方法

2022/10/05に公開

結論

型アサーションを使う。

実装

引数に文字列を受け取り、標準出力する関数に対して、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を保持していることを主張します。 iTを保持していない場合、panicになる。
このiTを保持しているか確認するために、型アサーションは2つの引数を返すことができる。

t, ok := i.(T)

okには、アサーションが可能であるかを表すboolが入る。
また、もしokがfalseになった場合には、tにはTのゼロ値が入ることになり、panicにはならない。

Discussion