新来到这里。我正在接受一个tour的Go,并且遇到了一个我很困惑的词。
它是 Method 部分here的第11页。它说," 接口值可以被认为是值和具体类型的元组。"
我的理解是接口值是实现该接口的变量。 E.g:
type Animal interface {
run()
}
type Cat struct { … }
func main() {
kitty := Cat{ … }
}
func (c Cat) run() { … }
kitty
是否为接口值?
答案 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虽然您需要阅读更多内容并自行尝试一些示例,以便更好地理解这一点。