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

时间:2018-06-01 09:05:00

标签: go interface

新来到这里。我正在接受一个tour的Go,并且遇到了一个我很困惑的词。

它是 Method 部分here的第11页。它说," 接口值可以被认为是值和具体类型的元组。"

我的理解是接口值是实现该接口的变量。 E.g:

type Animal interface {
    run()
}

type Cat struct { … }

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

func (c Cat) run() { … }

kitty是否为接口值?

2 个答案:

答案 0 :(得分:5)

在您使用short variable declaration创建kitty的情况下,从右侧表达式推断出类型,kitty的类型将是具体类型{{1 }}

但由于Cat 具体类型(非接口类型)实现Cat interface类型,您可以指定值{{1} }到类型为Animal的变量,如下例所示:

Cat

“实施”按规格表示:

  

接口类型指定一个名为 interface method set。接口类型的变量可以使用方法集存储任何类型的值,该方法集是接口的任何超集。据说这种类型实现了接口

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

有关界面内部的更多详细信息,请阅读博文:The Go Blog: The Laws of Reflection
Go Data Structures: Interfaces (by Russ Cox)

有关为什么需要界面或如何/何时使用界面的介绍,请参阅Why are interfaces needed in Golang?

答案 1 :(得分:1)

"接口值可以被认为是值和具体类型的元组。" - >接口在某种程度上只关心你的类型是否实现了它所需的方法。它的数据结构存储两件事:1。实现它的类型2.值(#1中的类型)

这是一个简单的例子,只是为了让你知道它是什么样的:

package main

import (
    "fmt"
    "reflect"
)

type Animal interface {
    run()
}

type Cat struct {
    a int
}

func main() {
    kitty := Cat{2}
    var anim Animal
    fmt.Println(kitty)
    kitty.run()
    anim = kitty //interface
    fmt.Println(anim)
    anim.run()
    t := reflect.TypeOf(anim)
    v := reflect.ValueOf(anim)
    fmt.Println(t.String())
    fmt.Println(v)

}

func (c Cat) run() {
    fmt.Println("Have fun")
}

输出:

{2}
Have fun
{2}
Have fun
main.Cat
{2}

https://play.golang.org/p/xeozR3VT-9J虽然您需要阅读更多内容并自行尝试一些示例,以便更好地理解这一点。