我有一个界面:
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"以上是完全一样的。有一个减少重复代码的好方法吗?例如。定义函数一次并将其分配给三个结构?
答案 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
}