前回までのあらすじ
第2回目は「クロージャー」について学びました。もしよかったらご覧ください。
今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。
型アサーションとは
インターフェース型の変数が具体的な型に保持している値を取得するための機能のことです。
インターフェース型は異なる型の値を扱うことができるため、なんの型が入っているかがわかりにくくなります。そこで、型アサーションを使うとインターフェースの内部にある具体的な値の型を確認・取得できます。
value := x.(T)
x: インターフェース型の変数
T: 具体的な型(例えば、intやstringなど)
上記が型アサーションの基本的な形になります。(T)
に入っている型と同じであれば出力し、違った場合はエラーを発生します。ただ、このエラーはGoの実行時エラー(panic)になり、あまり良いエラーではありません。なので一手間加えることで、エラーを防ぐことができます。
value, ok := x.(T)
型が違う場合ok
にfalseが、同じ場合はtureが代入されて、パニックを起こしません。
実際に使ってみる
実際に型アサーションを使って、出力してみました。しっかりと判別できていることがわかりますね。
var x interface{} = 10
num, ok := x.(int)
str, ok := x.(string)
fmt.Println(num, ok)
// 10 ture
fmt.Println(str, ok)
// false (空文字が入っている)
また、さらに実用的に判別するには条件分岐が使えます。こちらはif文を用いて、判別しています。if文だと少し長ったらしく読みにくさが目立ちますね。
var x interface{} = 10
if x == nil {
fmt.Println("x is nil")
} else if i, ok := x.(int); ok {
fmt.Println("x is int", i)
} else if s, ok := x.(string); ok {
fmt.Println("x is string", s)
} else {
fmt.Println("x is not int or string")
}
// x is int 10
これをswitch文で書くと大幅に整形することができます。少しだけ書き方に癖があるのでこちらは覚えておかないといけませんが綺麗になります。
var x interface{} = 10
switch x.(type) {
case nil:
fmt.Println("x is nil")
case int:
fmt.Println("x is int")
case string:
fmt.Println("x is string")
default:
fmt.Println("x is not int or string")
}
switch文を使うこと推奨されているそうです。なので、型アサーションを使用するときはよほどの理由がない限りはswitch文を使うようにしたいですね。
使い方
インターフェース型から具体的な型を取り出す
インターフェースを使って異なる型の値を扱い、それを元の具体的な型に戻したい場合に使います。
型を安全に変換する
インターフェース型の変数が特定の型を持っているかどうかを確認しながら、エラーを防ぐために利用されます。