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

mad*_*per 2 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)
}
Run Code Online (Sandbox Code Playgroud)

我有三个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 ....
}
Run Code Online (Sandbox Code Playgroud)

但是,上面的"code1","code2"和"code3"完全相同.这是减少重复代码的好方法吗?例如,定义一次函数并将其分配给三个结构?

Sim*_*ead 7

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

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

type UserRepo struct {
}
Run Code Online (Sandbox Code Playgroud)

将方法添加到该类型:

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

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

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

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

type s3 struct {
    *UserRepo
    // other stuff here..
}
Run Code Online (Sandbox Code Playgroud)

然后你可以:

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

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

// etc..
Run Code Online (Sandbox Code Playgroud)

..你也可以这样做:

doStuff(u)
doStuff(u2)
Run Code Online (Sandbox Code Playgroud)

..在哪里doStuff:

func doStuff(u UserReader) {
    // any of the three structs
}
Run Code Online (Sandbox Code Playgroud)

Click here to see it in the Playground