满足多个接口的可链接结构方法?
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 键入 SetA
和 SetB
时,这意味着 t
未实现 A 和 B 接口。 SetA
的签名和 *t
的 SetB
函数与接口 A 和 B 相应地不匹配。
其实SetA(a string) A
和SetA(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
我需要用几乎相同的字段和方法创建多个结构,并执行相同的操作。我想与其那样做,不如创建一个结构并使用接口来限制交互。效果很好!现在的问题。我希望这些方法 可链接 。为此,方法需要 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 键入 SetA
和 SetB
时,这意味着 t
未实现 A 和 B 接口。 SetA
的签名和 *t
的 SetB
函数与接口 A 和 B 相应地不匹配。
其实SetA(a string) A
和SetA(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