为什么不能用指针接收器来实现接口

我很困惑,为什么这不能编译:

不可能的types断言:Faz没有实现Foo(Bar方法有指针接收器)

如果我使接收器Faz.Bar Faz值而不是一个Faz指针,然后它编译好,但我认为总是有更好的指针接收器,所以值不被复制?

package main import ( "log" ) func main() { foo := New().(Faz) log.Println(foo) } type Foo interface { Bar() string } func New() Foo { return &Faz{} } type Faz struct { } func (f *Faz) Bar() string { return `Bar` } 

2 Solutions collect form web for “为什么不能用指针接收器来实现接口”

因为它是*Faz而不是Faz

 func main() { foo := New().(*Faz) log.Println(foo) } 

我认为这个问题的答案需要对语法有更多的回顾,如何通过软件工程来实现。 (不要过分简化)


首先是什么types的快速闪回?
它们只是带有编译器逻辑的内存块。 使stringstring不同的是编译器允许我们使用这些内存块。 (更深入地思考,你可能会开始意识到strongly typeddynamically typed语言之间的真正区别。)

现在接下来你需要认识到指针是他们自己的types。
*variable是一个不同的内存块(又名types)比variable 。 只是编译器总是假设*variable内容总是要成为声明右侧的内存块的地址,以及它所施加的其他限制/function。

那么让我们回顾一下界面是什么。
伪科学定义 :任何一类公民具有特定types的一套要求。 翻译成软件工程 – 与契约( interface )中描述的相关的内存结构(回想结构打包 )的任何内存块(types)都可以像合同中提到的types名一样传递。


现在你可能会开始意识到,当你说

func (f *Faz) Bar() stringf的持有一个函数的内存块,其中f的types是指向Faz的指针

哪里有地方

func (f Faz) Bar() stringf的内存块,其中f的types是Faz

所以当你说一个*Faztypes的variables满足一个契约时,那么你怎么能假定一个Faztypes的variables将被限定为代码中的接口types呢? select满足您的合同,只有这种types可以承担代码中的接口types。

  • Go有lambdaexpression式还是类似的?
  • 为什么我不能将* Struct分配给*接口?
  • 有没有办法在Golang中迭代整个范围?
  • 为什么我可以input别名函数并使用它们而不需要强制转换?
  • Golang - 从地图上获取一部分密钥
  • 如何设置和获取Golang结构中的字段?
  • 将字节数组转换为golang中的io.read
  • Go和int64有什么不同?