我正在尝试创建一个可克隆的接口,并且遇到一些问题,需要获取结构来实现接口。看起来这是一个限制,而不是许多其他语言。我试图理解这个限制的理由。
var _ Cloneable = test{}
type Cloneable interface {
Clone() Cloneable
}
type test struct {
}
func (t *test) Clone() *test {
c := *t
return &c
}
游乐场:https://play.golang.org/p/Kugatx3Zpw
跟进问题,因为它对我来说似乎仍然很奇怪。这也不编译
var _ Cloneable = &test{}
type Cloneable interface {
Clone() Cloneable
}
type Cloneable2 interface {
Clone() Cloneable2
}
type test struct {
}
func (t *test) Clone() Cloneable2 {
c := *t
return &c
}
答案 0 :(得分:3)
要满足接口方法,参数和返回类型必须使用接口声明中使用的相同类型。 Clone
方法必须返回Cloneable
以满足接口:
func (t *test) Clone() Cloneable {
c := *t
return &c
}
Clone
方法无法返回*test
或Cloneable2
,因为这些类型不是Cloneabl
类型。
指针类型实现接口:
var _ Cloneable = &test{}
由于test
类型必须满足编译Cloneable
方法的Clone
接口,因此不需要此compile time assertion。
(问题是移动目标。这是对问题的两个先前编辑的答案。)
答案 1 :(得分:0)
我发现这个线程谈论它并且答案似乎是支持协变函数类型会使语言更难以理解而没有什么好处。 https://github.com/golang/go/issues/7512
至少他们有意识地决定不支持大多数其他语言支持的功能。我不是真的买它,但是哦,好吧......