因为在 Golang 中,接口 变量的动态类型是变化的,有时我们需要知道一个接口 变量 的动态 类型 究竟是什么,这就需要使用类型断言,类型断言就是对接口变量的类型进行检查。
value, ok := x.(T)
参数 | 描述 |
---|---|
x | 需要转换的数据。 |
T | 需要转换的类型。 |
返回值 | 描述 |
---|---|
value | 转换后的数据。 |
ok | 转换成功与否的 bool 变量表示。 |
将接口 x 转换成 T 类型。 如果转换成功,返回转换成功后的值,即 value,ok 为 true。如果转换失败,value 为 零值,ok 为 false。
使用类型断言,将接口类型转成 int
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 使用类型断言,将接口类型转成 int
var intvalue interface{}
intvalue = 100
if value, ok := intvalue.(int); ok{
fmt.Println("Ok Value =", value, "Ok =", ok)
}else{
fmt.Println("Failed Value =", value, "Ok =", ok)
}
}
程序运行后,控制台输出如下:
首先,我们定义了一个接口类型的变量 intvalue,并给其赋值为 100,接着,我们使用类型断言将变量 intvalue 转成 int 类型。
类型断言转换,返回两个值,一个表示转换后的值,一个 bool 类型的变量表示是否转换成功。最后,我们发现,成功将接口类型转成了 int 类型,并返回了转换成功后的值。
使用类型断言,如果断言失败,返回 false
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 使用类型断言,如果断言失败,返回 false
var intvalue interface{}
intvalue = 100
if value, ok := intvalue.(float32); ok{
fmt.Println("Ok Value =", value, "Ok =", ok)
}else{
fmt.Println("Failed Value =", value, "Ok =", ok)
}
}
程序运行后,控制台输出如下:
首先,我们定义了一个接口类型的变量 intvalue,并给其赋值为 100,接着,我们使用类型断言将变量 intvalue 转成 float32 类型。
因为,我们赋值的为 int 类型的值,我们却将接口转成了 float32,因此类型转换失败,即断言转换失败,所以 ok 为 false,value 为 0。
使用类型断言,只使用一个值接受断言结果,则返回断言后的值
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 使用类型断言,只使用一个值接受断言结果,则返回断言后的值
var intvalue interface{}
intvalue = 100
value := intvalue.(int)
fmt.Println("Ok Value =", value)
}
程序运行后,控制台输出如下:
在使用类型断言时,如果我们只使用一个值接受断言的返回值,如果断言成功,那么会直接返回断言成功后的值。
使用类型断言,如果断言失败,不使用 bool 变量接受,程序 panic
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 使用类型断言,如果断言失败,不使用 bool 变量接受,程序 panic
var intvalue interface{}
intvalue = 100
value := intvalue.(float32);
fmt.Println("Ok Value =", value)
}
程序运行后,控制台输出如下:
在使用类型断言时,如果我们只使用一个值接受断言的返回值,那么此时如果断言失败,那么程序会 panic。
因为在 Golang 中,接口变量的动态类型是变化的,有时我们需要知道一个接口变量的动态类型究竟是什么,这就需要使用类型断言,类型断言就是对接口变量的类型进行检查。Go 语言类型断言语法:
value, ok := x.(T)