如何声明和使用公开Fluent API的接口

问题描述 投票:0回答:2

我希望以下工作能够发挥作用:

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 的全部意义不就是与实现解耦吗?...

go interface
2个回答
0
投票

Test
接口需要一个方法
X
返回
Test
(即:接口类型)。您的
test
结构体有一个返回
test
(即:结构体)的方法。返回实现接口的方法在 go 中被认为与返回接口值的方法不同。

更改您的

test.X
方法以返回
Test
,或者不使用接口并直接使用结构(如果可能)。


0
投票

OP,我遇到了同样的问题,也很惊讶。我特别好奇这个决定背后的理由是什么,这个决定是否遵循特定的原则等等。

Go FAQ 确实专门解决了这个问题。 https://go.dev/doc/faq#covariant_types。根据问题本身,这是关于“协变结果类型”,Go 不支持。

常见问题解答只有一段。一些关键的引用是“Go 方法类型必须完全匹配”和“如果两个方法返回不同的类型,则它们不会做相同的事情”。更广泛地说,基本设计原则是想要协变结果类型可能意味着您需要类型层次结构,而 Go 不喜欢类型层次结构。这些不是我的意见;我只是一个使者。

© www.soinside.com 2019 - 2024. All rights reserved.