对于给定的接口,我有三个实现。三个实现如何共享同一个方法?

时间:2014-10-02 03:34:58

标签: go

我有一个界面:

type Reader interface {
    // Read IV and Master header
    ReadMaster(p []byte, full bool) (int, error)

    // Read User header
    ReadUser(p []byte, full bool) (int, error)

    // Read Content data
    ReadContent(p []byte) (int, error)
}

我有三个struct与界面兼容。所有三个结构都具有samve方法ReadUser。所以我必须这样做:

func (r *s1) ReadUser(buf []byte, full bool) (int, error) {
//.... code 1 ....
}
func (r *s2) ReadUser(buf []byte, full bool) (int, error) {
//.... code 2 ....
}
func (r *s3) ReadUser(buf []byte, full bool) (int, error) {
//.... code 3 ....
}

然而," code1"," code2"和#34; code3"以上是完全一样的。有一个减少重复代码的好方法吗?例如。定义函数一次并将其分配给三个结构?

1 个答案:

答案 0 :(得分:7)

将其包装在自己的类型中。还要记住Go中的接口应该只为小的特定任务提供合同。接口通常只包含一个方法。

type UserReader interface {
    ReadUser(p []byte, full bool) (int, error)
}

type UserRepo struct {
}

将方法添加到该类型:

func (ur *UserRepo) ReadUser(p []byte, full bool) (int, error) {
    // code to read a user
}

然后,将其嵌入其他类型:

type s1 struct {
    *UserRepo
    // other stuff here..
}

type s2 struct {
    *UserRepo
    // other stuff here..
}

type s3 struct {
    *UserRepo
    // other stuff here..
}

然后你可以:

u := s1{}
i, err := u.ReadUser(..., ...)

u2 := s2{}
i2, err2 := u2.ReadUser(..., ...)

// etc..

..你也可以这样做:

doStuff(u)
doStuff(u2)

..其中doStuff是:

func doStuff(u UserReader) {
    // any of the three structs
}

Click here to see it in the Playground