Go语言类型断言

Go语言类型断言教程

因为在 Golang 中,接口 变量的动态类型是变化的,有时我们需要知道一个接口 变量 的动态 类型 究竟是什么,这就需要使用类型断言,类型断言就是对接口变量的类型进行检查。

Go语言类型断言

语法

value, ok := x.(T)

参数

参数 描述
x 需要转换的数据。
T 需要转换的类型。

返回值

返回值 描述
value 转换后的数据。
ok 转换成功与否的 bool 变量表示。

说明

将接口 x 转换成 T 类型。 如果转换成功,返回转换成功后的值,即 value,ok 为 true。如果转换失败,value 为 零值,ok 为 false。

类型T说明

  • 如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。
  • 如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。
  • 无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。

案例

类型断言

使用类型断言,将接口类型转成 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) } }

程序运行后,控制台输出如下:

06_golang类型断言.png

首先,我们定义了一个接口类型的变量 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) } }

程序运行后,控制台输出如下:

07_golang类型断言.png

首先,我们定义了一个接口类型的变量 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) }

程序运行后,控制台输出如下:

08_golang类型断言.png

在使用类型断言时,如果我们只使用一个值接受断言的返回值,如果断言成功,那么会直接返回断言成功后的值。

类型断言失败

使用类型断言,如果断言失败,不使用 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) }

程序运行后,控制台输出如下:

09_golang类型断言.png

在使用类型断言时,如果我们只使用一个值接受断言的返回值,那么此时如果断言失败,那么程序会 panic。

Golang类型断言总结

因为在 Golang 中,接口变量的动态类型是变化的,有时我们需要知道一个接口变量的动态类型究竟是什么,这就需要使用类型断言,类型断言就是对接口变量的类型进行检查。Go 语言类型断言语法:

value, ok := x.(T)