我正在使用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)
}