Go接口方法返回指向其自身的指针



我正在使用Go中的一个上游包,该包提供了一个典型的方法,该方法具有返回指向相同结构的指针(类似于典型的构建器模式(。例如:

type Dog struct {
AddCollar() *Dog
}

出于某些原因,我想在某些场景中模拟这种结构(例如本地开发,或者当一些Dog属性不存在时等等(

我决定制作一个通用接口:

type Animal interface {
AddCollar() Animal
}

我的第一反应是在这里返回Animal,而不是*Animal,因为指向接口的指针似乎没有意义(而且似乎也不起作用(。

我的模拟只是这样,这真的没有任何作用(相比之下,上游Dog会做更多在这种情况下不需要的工作(:

type DogMock struct{}
func (d *DogMock) AddCollar() *DogMock {return d}

然而,在写下并尝试使用我的模拟结构后,我得到了:

need method: AddCollar() Animal
have method: AddCollar() *DogMock

但我的*DogMock对象实际上实现了Animal。两个签名都返回相同的错误:

type DogMock struct{}
func (d *DogMock) AddCollar() *DogMock {return d}
func (d *DogMock) AddCollar() Animal {return d}

注意,func (d *DogMock) AddCollar() Animal {return d}似乎不是解决方案,因为我无法编辑上游结构Dog,方法AddCollar()返回*Dog,而不是Animal

有没有一种方法可以在我的Animal接口中指定返回指向其自身结构的指针?

您的DogMock只需要返回Animal。一旦DogMock返回Animal,那么它就是Animal了,您可以将*DogMok返回为Animal。

package main
import "fmt"
type Animal interface {
AddCollar() Animal
AddLeash() Animal
}
type Dog struct {
HasCollar bool
HasLeash  bool
}
func (d *Dog) AddCollar() Animal {
d.HasCollar = true
return d
}
func (d *Dog) AddLeash() Animal {
d.HasLeash = true
return d
}
func main() {
var a Animal = &Dog{}
fmt.Printf("%#vn", a)
a.AddCollar().AddLeash()
fmt.Printf("%#vn", a)
}

最新更新