Goにおけるアサーションの実装方法を教えてください。
Go言語では、型アサーションを使ってアサーションできます。
型アサーションの構文形式はx.(T)で、xはインタフェイスタイプ式の式、Tは具体的な型です。その意味は:xがインタフェイスタイプTを実現していたら真で、動的値(Dynamic Value)を返し、実現していなければパニック例外を作動させます。
次に、型アサーションを使った例を示します:
package main
import "fmt"
func main() {
var i interface{} = "Hello"
s, ok := i.(string)
if ok {
fmt.Println("i is a string:", s)
} else {
fmt.Println("i is not a string")
}
f, ok := i.(float64)
if ok {
fmt.Println("i is a float64:", f)
} else {
fmt.Println("i is not a float64")
}
}
自然な日本語で言い換えると次のようになります。
i is a string: Hello
i is not a float64
上記の例、i は文字列を持つ空インターフェイス型の変数です、タイプアサーションを使い i が文字列型かを調べ、結果は s と ok に代入されます、アサーションが成功した場合(ok が true)、 i は文字列であり文字列の値が出力されます、アサーションが失敗した場合(ok が false)、i は文字列ではありませんが出力されます。
型アサーションを行う際には、アサートされる値がインターフェース型変数かまたはnilでなければパニックが発生することに注意してください。そのため、型アサーションを行う前には、アサーションが成功するかどうかを判定するために型アサーションの安全な形式を使用して、アサーションの結果と真偽値を組み合わせる必要があります。