【问题标题】:Is an Interface a Pointer?接口是指针吗?
【发布时间】:2021-06-04 00:23:38
【问题描述】:

假设我有以下类型定义:

type ICat interface {
  Meow() string
} 

type Cat struct {   
  Name string
}

func (c Cat) Meow() string { 
  return "Meow" 
}

当我执行这个操作时:

var a Cat
a.Name = "Tom"

在内存中分配了一个 Cat 类型的结构,并分配了它的一个字段。

但是,如果执行以下操作:

var b ICat

内存中究竟分配了什么? Golang 接口只是一个包含指向另一个结构的指针的结构吗? “盒装指针”?。

【问题讨论】:

  • 它(就像)一个指向具体数据的指针,但仅限于接口提供的方法。这也是为什么你可以在 interface{} 中放入任何东西的原因,因为 go 中的每个类型都至少实现了 0 个方法。此处的其他答案很好地解释了实际实现。
  • "是一个 Golang 接口只是一个包含指向另一个结构的指针的结构?一个“盒装指针”?" 1.语言的名称是“Go”(不是Golang)。 2. 这是一个实现细节,过去发生了变化,将来可能会发生变化。 3. 没有必要知道这一点,因为您无法对这些信息做任何事情。

标签: go


【解决方案1】:

一个接口包含两件事:一个指向底层数据的指针,以及该数据的类型。所以,当你声明

var b ICat

b 包含这两个元素。

当你这样做时:

b:=Cat{}

b 现在包含一个指向Cat{} 副本的指针,并且数据是struct Cat

当你这样做时:

b:=&Cat{}

b 现在包含指向Cat{} 的指针的副本,并且事实上它是*Cat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2018-11-06
    相关资源
    最近更新 更多