Go接口值是实现接口的整个变量吗?

Nat*_*han 2 interface go

新来到这里.我正在参观 Go并且遇到一个词,我很困惑它是什么.

这是第11页方法一节在这里.它说," 界面值可以被认为是价值和具体类型的元组."

我的理解是接口值是实现该接口的变量.例如:

type Animal interface {
    run()
}

type Cat struct { … }

func main() {
    kitty := Cat{ … }
}

func (c Cat) run() { … }
Run Code Online (Sandbox Code Playgroud)

kitty接口值吗?

icz*_*cza 5

在您的情况下,因为您使用了短变量声明来创建kitty,所以从右侧表达式推断出类型,并且类型kitty将是具体类型Cat.

但由于Cat 具体类型(非接口类型)实现了Animal 接口类型,因此您可以Cat为类型为的变量赋值Animal,如下例所示:

kitty := Cat{}
var kitty2 Animal = kitty
Run Code Online (Sandbox Code Playgroud)

规范的"实施"意味着:

接口类型指定称为其接口方法集.接口类型的变量可以使用方法集存储任何类型的值,该方法集是接口的任何超集.据说这种类型实现了接口.

接口值在逻辑上包含一个(值;类型)对,它们是存储在它们中的值,以及它们的具体类型.

有关界面内部的更多详细信息,请阅读博客文章:Go Blog:反射
数据结构的规律:接口(由Russ Cox提供).

有关为什么需要接口或如何/何时使用它们的介绍,请参阅为什么Golang需要接口?