阐述一下Go语言里面的类型断言 ?
在 Go 语言中,类型断言是一种在运行时确定接口值底层具体类型的方式。它的基本语法格式如下:
t := i.(T)
在上面的语法中,i
是接口类型的值,T
是我们希望断言的类型,t
是 i
转换为 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
类型的值。