当前位置: 首页 > 面试题库 >

为什么隐式非指针方法不能满足接口?

洪和风
2023-03-14
问题内容

假设我们了解到,

用于类型明确的方法定义X,GO编译器隐式定义了相同的方法类型*X反之亦然 ,如果我声明,

func (c Cat) foo(){
  //do stuff_
}

并宣布

func (c *Cat) foo(){
  // do stuff_
}

然后GO编译器给出错误,

Compile error: method re-declared

这表明,指针方法是隐式定义的, 反之亦然

在下面的代码中,

package main

type X interface{
  foo();
  bar();
}

type Cat struct{

}

func (c Cat) foo(){
  // do stuff_
}

func (c *Cat) bar(){
  // do stuff_
}

func main() {
  var c Cat
  var p *Cat
  var x X

  x = p // OK; *Cat has explicit method bar() and implicit method foo()
  x = c //compile error: Cat has explicit method foo() and implicit method bar()

}

GO编译器出现错误,

cannot use c (type Cat) as type X in assignment:
    Cat does not implement X (bar method has pointer receiver)

x = c,因为隐式指针方法满足接口,但是隐式非指针方法不满足。

题:

为什么隐式非指针方法不满足接口?


问题答案:

让我们看一下语言规范:

类型可能具有与之关联的 方法集 。接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应指针类型
T的方法集是所有以接收者
T或T声明的方法的集合(也就是说,它还 包含方法 T )。

在您的示例中,接口类型的方法集x[foo(), bar()]。该类型的方法集Cat[foo()],与该类型的方法组*Cat[foo()]+ [bar()]= [foo(), bar()]

这解释了为什么变量p满足接口x,而变量c却不满足。



 类似资料:
  • 问题内容: 给定golang巡回演出的第54张幻灯片中的设置: 为什么不能同时为结构体和指向结构体的指针定义方法?那是: 定义此将产生以下错误: 问题答案: 它可以。只需在结构而不是指针上定义它即可。它将解决两种方式 方法集 对应的指针类型 T的方法集是接收者 T或T的所有方法的集(即,它也包含T的方法集) 尝试直播:http://play.golang.org/p/PsNUerVyqp 更新:

  • 问题内容: 根据这个问题的回答 关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法 但实际上我可以对非指针值执行指针方法: 那么,这是怎么了?这是新功能吗?还是对问题的回答是错误的? 问题答案: 您正在对指针值调用“指针方法”。在表达式中: 是类型(非指针);由于该方法具有指针接收者,并且由于接收者值是非指针且可寻址,因此它是以下各项的简写形式: 这是在规范中:

  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1:

  • 上面的代码不会编译为错误: 错误[E0277]: trait绑定

  • 我正在尝试使用boto构建DynamoDB表,这将在表中保存IAM策略的各个方面。我已经为keyschema定义了属性,我不理解错误。我对DYanmoDB和AWS非常陌生。这是我的代码: 这就是我得到的错误: botocore.exceptions.ClientError:调用CreateTable操作时发生错误(ValidationException):检测到1个验证错误:值'[com.amaz

  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。