空接口和转化

在大多数面向对象的语言中,经常有一个内建的叫 object 的基类,是所有其他类的超类。Go 没有继承,也没有这样一个超类。不过他确实有一个没有任何方法的空接口: interface{}。因为空接口没有方法,可以说所有类型都实现了空接口,并且由于空接口是隐式实现的,因此每种类型都满足空接口契约。

如果我们想,我们可以定义如下签名的 add 函数:

func add(a interface{}, b interface{}) interface{} {
  ...
}

为了将一个接口变量转化为一个显式的类型,又可以用 .(TYPE)

return a.(int) + b.(int)

提醒,如果底层类型不是 int,上面的结果将是 error。

你也可以访问强大的类型转换:

switch a.(type) {
  case int:
    fmt.Printf("a is now an int and equals %d\n", a)
  case bool, string:
    // ...
  default:
    // ...
}

你将会看到,使用空接口可能超出了你的期望。虽然它让代码看起来不那么好看,来回转换代码有时看起来也很丑陋并且危险,但在一个静态语言中,它是唯一的选择。

热门教程

最新教程