我有一个界面:
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"完全相同.这是减少重复代码的好方法吗?例如,定义一次函数并将其分配给三个结构?
将它包装在自己的类型中.还要记住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