Go语言接口值是否为实现接口的变量?kitty是否属于接口值?
关于Go语言接口值的疑问解答
嘿,我来帮你把这个概念捋清楚!
首先直接给你答案:kitty不是接口值,它只是Cat结构体类型的一个具体实例。
接下来拆解一下你疑惑的点,以及接口值到底是什么:
你在官方教程里看到的“接口值可视为一个值和具体类型的元组”这句话非常关键,咱们把它拆解开理解:
- 接口值本质是一个复合结构,它包含两个核心部分:
- 一个指向具体值的引用(或者具体值本身,取决于对应类型是值类型还是引用类型)
- 该具体值对应的类型信息
这两部分合起来就像一个元组(值, 类型),这就是教程里那句话的含义。
回到你的代码示例:
type Animal interface { run() } type Cat struct { … } func main() { kitty := Cat{ … } } func (c Cat) run() { … }
这里的kitty是直接声明的Cat类型变量,它存储的就是Cat结构体的具体数据,完全没有接口相关的包装逻辑。那什么时候才会产生接口值呢?当你把这个Cat实例赋值给一个Animal接口类型的变量时:
func main() { kitty := Cat{ … } var animal Animal = kitty // 这里的animal就是接口值 }
此时animal这个接口值里就保存了一个元组:(kitty, Cat)——也就是具体的Cat实例,以及它的类型Cat。这样当你调用animal.run()时,Go就能根据这个元组找到对应的Cat类型的run方法去执行。
补充个小细节:如果你的run方法是用指针接收者定义的,比如func (c *Cat) run() { … },那接口值里的元组就会变成(&kitty, *Cat),也就是存储的是Cat实例的指针和指针类型。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

