返回它自己的接口(Cloneable)

时间:2017-01-26 19:11:28

标签: go

我正在尝试创建一个可克隆的接口,并且遇到一些问题,需要获取结构来实现接口。看起来这是一个限制,而不是许多其他语言。我试图理解这个限制的理由。

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
}

游乐场:https://play.golang.org/p/jlyMDPF1WB

2 个答案:

答案 0 :(得分:3)

要满足接口方法,参数和返回类型必须使用接口声明中使用的相同类型。 Clone方法必须返回Cloneable以满足接口:

func (t *test) Clone() Cloneable {
  c := *t
  return &c
}

Clone方法无法返回*testCloneable2,因为这些类型不是Cloneabl类型。

指针类型实现接口:

var _ Cloneable = &test{}

由于test类型必须满足编译Cloneable方法的Clone接口,因此不需要此compile time assertion

playground example

(问题是移动目标。这是对问题的两个先前编辑的答案。)

答案 1 :(得分:0)

我发现这个线程谈论它并且答案似乎是支持协变函数类型会使语言更难以理解而没有什么好处。 https://github.com/golang/go/issues/7512

至少他们有意识地决定不支持大多数其他语言支持的功能。我不是真的买它,但是哦,好吧......