我希望以下工作能够发挥作用:
func New() Test {
return test{}
}
type test struct{}
func (t test) X() test {
return t
}
type Test interface {
X() Test
}
但是编译器说:
Cannot use 'test{}' (type test) as the type Test Type does not implement 'Test'
need the method: X() Test
have the method: X() test
这完全没有意义。如果我将 X() 实现更改为:
func (t test) X() Test {
return t
}
它有效。这只是他们实施的又一个错误的东西,还是我在这里做错了什么?
接口 impl 的全部意义不就是与实现解耦吗?...
Test
接口需要一个方法 X
返回 Test
(即:接口类型)。您的 test
结构体有一个返回 test
(即:结构体)的方法。返回实现接口的方法在 go 中被认为与返回接口值的方法不同。
更改您的
test.X
方法以返回 Test
,或者不使用接口并直接使用结构(如果可能)。
OP,我遇到了同样的问题,也很惊讶。我特别好奇这个决定背后的理由是什么,这个决定是否遵循特定的原则等等。
Go FAQ 确实专门解决了这个问题。 https://go.dev/doc/faq#covariant_types。根据问题本身,这是关于“协变结果类型”,Go 不支持。
常见问题解答只有一段。一些关键的引用是“Go 方法类型必须完全匹配”和“如果两个方法返回不同的类型,则它们不会做相同的事情”。更广泛地说,基本设计原则是想要协变结果类型可能意味着您需要类型层次结构,而 Go 不喜欢类型层次结构。这些不是我的意见;我只是一个使者。