什么是类型断言

类型断言(<font style="color:#444444;">Type Assertion</font>)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。 之所以会有这个问题,我猜是因为Golang中存在空接口,空接口可以存储任意类型的值。那么我们如何获取其存储的具体数据呢?

接口值

一个接口的值(简称接口值)是由一个具体类型具体类型的值两部分组成的。这两部分分别称为接口的动态类型动态值

我们来看一个具体的例子

  1. var w io.Writer
  2. w = os.Stdout
  3. w = new(bytes.Buffer)
  4. w = nil
请看下图分解

类型断言 - 图1

想要判断空接口中的值这个时候就可以使用类型断言,其语法格式:
  1. x.(T)

其中:

  • x:表示类型为interface{}的变量
  • T:表示断言x可能是的类型。

该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。

举个例子:
  1. func main() {
  2. var x interface{}
  3. x = "Hello 沙河"
  4. v, ok := x.(string)
  5. if ok {
  6. fmt.Println(v)
  7. } else {
  8. fmt.Println("类型断言失败")
  9. }
  10. }

:::warning

因为空接口可以存储任意类型值的特点,所以空接口在Go语言中的使用十分广泛。

关于接口需要注意的是,只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。

:::

参考