2 回答
TA贡献1846条经验 获得超7个赞
该错误描述了这一切:
dog.WagTail未定义(动物类型没有字段或方法WagTail)
要实现一个接口,您应该实现在其内部定义的所有方法。
dog := NewDog("Brown")
dog.MakeNoise()
dog.WagTail()
现在NewDog返回包含MakeNoise方法但不包含的动物接口WagTail。
管理需求的唯一方法是创建结构类型的变量,Dog然后可以调用将Dog作为接收者的任何方法。
d := &Dog{"Brown"}
d.WagTail()
或者,您可以Dog从NewDog方法中返回指向struct的指针,就像在注释中提到的代码中那样:
func NewDog(color string) *Dog {
return &Dog{color}
}
但是,如果未在接口中定义该方法,则无法使用struct作为方法接收者来实现它。
Golang提供了一种方法:
您可以要求编译器通过尝试使用T的零值或指向T的指针进行赋值(如果适用)来检查类型T是否实现了接口I。
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
如果T(或* T,相应地)未实现I,则错误将在编译时捕获。
如果希望某个接口的用户明确声明他们实现了该接口,则可以在该接口的方法集中添加一个具有描述性名称的方法。例如:
type Fooer interface {
Foo()
ImplementsFooer()
}
然后,类型必须将ImplementsFooer方法实现为Fooer,清楚地记录事实并在godoc的输出中宣布该事实。
type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}
大多数代码不使用此类约束,因为它们限制了界面概念的实用性。但是有时候,它们对于解决相似接口之间的歧义是必不可少的。
TA贡献2012条经验 获得超12个赞
- 2 回答
- 0 关注
- 264 浏览
添加回答
举报