为了账号安全,请及时绑定邮箱和手机立即绑定

接口实现中的非接口方法

接口实现中的非接口方法

Go
森林海 2021-04-09 22:18:31
我有一个定义方法的接口。我有一个实现此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。例如:package mainimport (    "fmt")   type Animal interface {    MakeNoise()}type Dog struct {    color string}/* Interface implementation */func (d *Dog) MakeNoise() {    fmt.Println("Bark!")}/* End Interface implementation */func (d *Dog) WagTail() {    fmt.Println(d.color + " dog: Wag wag")}func NewDog(color string) Animal {    return &Dog{color}}func main() {    dog := NewDog("Brown")    dog.MakeNoise()    dog.WagTail()}在操场上:https : //play.golang.org/p/B1GgoNToNl_l在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误dog.WagTail未定义(动物类型没有字段或方法WagTail)。有没有一种方法可以使结构坚持接口并定义其自己的方法?
查看完整描述

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() {}

大多数代码不使用此类约束,因为它们限制了界面概念的实用性。但是有时候,它们对于解决相似接口之间的歧义是必不可少的。


查看完整回答
反对 回复 2021-04-19
?
繁花如伊

TA贡献2012条经验 获得超12个赞

这可能对您有帮助。

d := dog.(*Dog)
d.WagTail()

在操场上:https : //play.golang.org/p/KlNqpmvFTJi


查看完整回答
反对 回复 2021-04-19
  • 2 回答
  • 0 关注
  • 264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信