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

时间:2015-05-22 18:35:36

标签: pointers interface go

我很困惑为什么无法编译:

  
    

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

  

如果我为Faz.Bar制作Faz.Bar的接收器而不是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 个答案:

答案 0 :(得分:52)

因为++$count; next if $count == 1 or $count > $some_other_value; 不是*Faz

Faz

答案 1 :(得分:4)

我认为这个问题的答案需要采用更加回顾性的语法方法,以及如何通过软件工程实现它。 (请原谅过度简化)

首先快速回顾什么是types
它们只是顶部带有编译器逻辑的内存块。使arraystring不同的原因是编译器允许我们对这些内存块执行的操作。 (深入思考,您可能会开始意识到strongly typeddynamically typed种语言之间的真正区别。)

现在接下来你需要意识到每个说法指针都是他们自己的类型。
*variable是与variable不同的内存块(也称为类型)。只是编译器始终假定*variable的内容始终是声明右侧类型的内存块的地址以及它所强加的其他限制/功能。

然后让我们回顾一下界面是什么 伪科学定义:任何一等公民属于特定类型的一组要求。 转换为软件工程 - 具有相同内存结构(回想 structure packing )的任何内存(类型)块,如合同中所述(interface)可以像合同提到的类型名称一样传递。

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

func (f *Faz) Bar() stringf内存块,其中f的类型指向Faz的指针

区域

func (f Faz) Bar() stringf的内存块,f的类型为Faz

因此,当您说*Faz类型的变量满足合约时,您如何假设Faz类型的变量将符合代码中的接口类型?选择满足您的合同,只有那种类型可以在您的代码中采用接口类型。