在实现Go接口时,如何处理重复性和灵活性?
我有一个项目使用这样的结构:在实现Go接口时,如何处理重复性和灵活性?,go,Go,我有一个项目使用这样的结构: type I interface { GetName() string DoSomething() } // // A implements I // type A struct { Name string } func (a *A) GetName() string { return a.Name } func (a *A) DoSomething() { ...do something } // // B implements
type I interface {
GetName() string
DoSomething()
}
//
// A implements I
//
type A struct {
Name string
}
func (a *A) GetName() string {
return a.Name
}
func (a *A) DoSomething() {
...do something
}
//
// B implements I
//
type B struct {
Name string
}
func (b *B) GetName() string {
return b.Name
}
func (b *B) DoSomething() {
...do something
}
func (b *B) DoSomethingElse() {
...do something else
}
//
// Both
//
func UseAorB(T I) {
name := T.GetName()...
}
GetName()
是一种很好的方法
type Common struct {}
func (c Common) DoSomething() {...}
type A struct {
Common
Stuff
}
type B struct {
Common
Other stuff
}
上面,A
和B
都有DoSomething
方法,它们共享实现
func f(in I) {
if b, ok:=in.(B); ok {
// b is of type B, so:
b.DoSomethingElse()
}
}
type DoesSometingElse interface {
DoSomethingElse()
}
func f(in I) {
if x, ok:=in.(DoesSomethingElse); ok{
x.DoSomethingElse()
}
}
func f(in I) {
if b, ok:=in.(B); ok {
// b is of type B, so:
b.DoSomethingElse()
}
}
type DoesSometingElse interface {
DoSomethingElse()
}
func f(in I) {
if x, ok:=in.(DoesSomethingElse); ok{
x.DoSomethingElse()
}
}
如果您觉得自己在与该语言作斗争,那么您要么是建模错误,要么是不知道用该语言做某事的正确方法。所有语言都有好的和坏的做事方式,而且很多时候,每种语言的方式都不同。如果你是从另一种语言开始学习围棋,你应该先停止用另一种语言思考,然后翻译围棋,试着单独使用围棋。如果接口的每个实现都完全相同,这可能意味着你不需要接口。除非你解释一下
DoSomething
实际做什么,很难建议您应该使用什么结构。相关/可能重复:;非常棒。嵌入结构是在实现同一接口的多个结构实例之间共享公共功能的最佳方式。