假设我们了解到,
用于类型明确的方法定义
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中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。