【Go】型アサーションについて

2023/03/23に公開

構文

Go言語の型アサーションは、以下のような構文で表されます。

value, ok := x.(T)

xという変数に対して、Tはアサーションする型を表します。

  • xの実際の型がTである場合
    - okにtrueを代入
    - valueにxの値をキャストして代入

  • xがTでない場合

    • okにfalseを代入
    • valueにはゼロ値を代入

アサーションの例

Go言語のインターフェース型またはany型は、その値がどの型であっても格納することができます。
例えば、以下のようにインターフェース型の変数xを宣言し、int型の値10を代入することができます。

var x interface{} = 10

以下は、変数xがint型であるかどうかを判定するコードです。

var x any
x = 10

value, ok := x.(int)
if ok {
	fmt.Printf("x is an int and its value is %d\n", value)
} else {
	fmt.Println("x is not an int")
}

上記の例では、xの値がint型であるため、okはtrueに設定されます。そのため、valueに10が代入され、"x is an int and its value is 10"が出力されます。

いつ型アサーションを使うのか?

例えば共通のErrorインターフェースを満たす、TimeoutErrorなどを利用したい場合。

if _, ok := err.(TimeoutError); ok {
    // キャストが成功したのでタイムアウトエラーと判定可能
}

参考

https://go-tour-jp.appspot.com/methods/15

https://future-architect.github.io/articles/20190713/#Q-エラーの構造体を作っています。そのエラーがタイムアウトかそうじゃないかを機械的にboolで判断できるようにするメソッドを追加したいのですが、どうすれば良いでしょうか?

Discussion