阐述一下Go语言里面的类型断言 ?

在 Go 语言中,类型断言是一种在运行时确定接口值底层具体类型的方式。它的基本语法格式如下:

t := i.(T)

在上面的语法中,i 是接口类型的值,T 是我们希望断言的类型,ti 转换为 T 类型后的值。

如果 i 不包含类型 T 的值,那么这个语句将会触发一个恐慌(panic)。为了防止这种情况,Go 语言提供了一种“安全”的类型断言,可以返回两个值:转换后的值以及一个报告断言是否成功的布尔值。

t, ok := i.(T)

如果 i 包含类型 T 的值,那么 t 将会是 i 的值,并且 ok 将会是 true。否则,t 将会是类型 T 的零值,并且 ok 将会是 false

以下是使用类型断言的一个例子:

var i interface{} = "hello"

s := i.(string)
fmt.Println(s) // 输出 "hello"

s, ok := i.(string)
fmt.Println(s, ok) // 输出 "hello true"

f, ok := i.(float64)
fmt.Println(f, ok) // 输出 "0 false"

f = i.(float64) // 触发 panic
fmt.Println(f)

在这个例子中,i 是一个包含 string 类型值的空接口。我们首先使用类型断言来将 i 转换为 string 类型,然后我们尝试将 i 转换为 float64 类型。因为 i 不包含 float64 类型的值,所以第二个类型断言失败,ok 的值为 false。然后,我们尝试一个不安全的类型断言,这将触发一个恐慌,因为 i 不包含 float64 类型的值。

发表评论

后才能评论