跳到主要内容

Golang 类型断言

提示
  1. 类型断言的基本用途: 类型断言用于访问接口存储的数据及其数据类型,解决空接口可能引起的数据类型不确定性。
  2. 类型检查和分配: 类型断言通过(type)形式检查并分配正确的数据类型,例如a.(int)检查a是否为int类型。
  3. 避免panic的安全用法: 使用类型断言时可以返回一个布尔值,用于安全检查数据类型匹配,避免程序因类型不匹配而异常中断。

类型断言允许我们访问接口存储的值的数据和数据类型。

在学习类型断言之前,让我们看看为什么在 Go 中需要类型断言。

我们知道,空接口可以接受任何类型和数量的值。例如,

// 创建一个空接口
var a interface {}

// 存储字符串类型的值
a = "Hello World"

// 存储整数类型的值
a = 10

这里,变量 a 是空接口类型的,它可以存储字符串和整数值。要了解更多关于空接口的信息,请访问 Go 空接口

这似乎是空接口的一个重要特性。然而,有时这会在接口持有的数据上造成歧义。

为了消除这种歧义,我们使用类型断言。

示例:Go 类型断言

package main
import "fmt"

func main() {

// 创建一个空接口
var a interface {}

// 将整数存储到空接口中
a = 10

// 类型断言
interfaceValue := a.(int)

fmt.Println(interfaceValue)
}

输出

10

在上述示例中,我们将整数值 10 存储到了表示为空接口的 a 中。注意代码,

interfaceValue := a.(int)

这里,(int) 检查 a 的值是否为整数。如果是 true,则值将被赋给 interfaceValue。

否则,程序将产生 panic 并终止。例如,

package main
import "fmt"

func main() {

// 创建一个空接口
var a interface{}

// 将整数存储到空接口中
a = "Golang"

// 类型断言
interfaceValue := a.(int)

fmt.Println(interfaceValue)
}

输出

panic: 接口转换: interface {}string,不是 int

这里,接口的值是一个字符串。所以,a.(int) 不为真。因此,程序产生 panic 并终止。

要了解更多关于 panic 的信息,请访问 Go panic 语句

在 Go 中避免类型断言的 panic

在 Go 中,类型断言语句实际上返回一个布尔值以及接口值。例如,

var a interface {}

a = 12
interfaceValue := a.(int)

这里,值 12 的数据类型与指定类型 (int) 匹配,所以这段代码将 a 的值赋给 interfaceValue。

除此之外,a.(int) 还返回一个布尔值,我们可以存储在另一个变量中。例如,

package main
import "fmt"

func main() {

// 创建一个空接口
var a interface{}
a = 12

// 类型断言
interfaceValue, booleanValue := a.(int)

fmt.Println("接口值:", interfaceValue)
fmt.Println("布尔值:", booleanValue)

}

输出

接口值: 12
布尔值: true

这里,你可以看到我们得到了数据和布尔值。

我们可以使用这个来避免 panic,如果数据类型与指定类型不匹配。

这是因为,当类型不匹配时,它返回 false 作为布尔值,所以不会发生 panic。例如,

package main
import "fmt"

func main() {

// 创建一个空接口
var a interface{}
a = "Golang"

// 类型断言
interfaceValue, booleanValue := a.(int)

fmt.Println("接口值:", interfaceValue)
fmt.Println("布尔值:", booleanValue)

}

输出

接口值: 0
布尔值: false

这里,你可以看到我们得到 0false 的输出,因为值的数据类型 (string) 与指定类型 (int) 不匹配。