满足多个接口的可链接结构方法?

Chainable struct methods that satisfies multiple interfaces?

我需要用几乎相同的字段和方法创建多个结构,并执行相同的操作。我想与其那样做,不如创建一个结构并使用接口来限制交互。效果很好!现在的问题。我希望这些方法 可链接 。为此,方法需要 return 对结构的引用。这样做之后,所有 return 都抱怨 (struct) does not implement <interface> (wrong type for <method> method)。这是预期的。

问题是,是否可以使用具有可链接方法的多个接口的单个​​结构?还是为每个接口创建单独的、重复的结构是唯一的方法?

我考虑过使用组合,但我仍然需要定义将调用嵌入式结构方法的方法,在这种情况下与创建新的纯结构没有区别。

示例问题:

https://play.golang.org/p/JrsHATdi2dr

package main

import (
    "fmt"
)

type A interface {
    SetA(string) A
    Done()
}

type B interface {
    SetB(string) B
    Done()
}

type t struct {
    a string
    b string
}

func (t *t) SetA(a string) *t { t.a = a; return t }
func (t *t) SetB(b string) *t { t.b = b; return t }
func (t *t) Done()            { fmt.Println(t.a, t.b) }

func NewTA() A {
    return &t{}
}

func NewTB() B {
    return &t{}
}

func main() {
    fmt.Println("Hello, playground")

    ta := NewTA()
    ta.SetA("a")
    ta.Done()

    tb := NewTB()
    tb.SetB("b")
    tb.Done()
}

当您使用 *t 作为 return 键入 SetASetB 时,这意味着 t 未实现 A 和 B 接口。 SetA 的签名和 *tSetB 函数与接口 A 和 B 相应地不匹配。

其实SetA(a string) ASetA(a string) *t不是同一个想法。您在界面中将 A 作为 return 类型用于 SetA,但将 *t 作为 return 类型用于 t,go 不支持此功能。 SetB 函数

相同

如果你这样做那么它将起作用,因为现在函数签名匹配

func (t *t) SetA(a string) A { t.a = a; return A(t) }
func (t *t) SetB(b string) B { t.b = b; return B(t) }

go playground 中的代码here