gpt4 book ai didi

go - 对于给定的接口(interface),我有三个实现。三个实现如何共享相同的方法?

转载 作者:IT王子 更新时间:2023-10-29 01:22:23 25 4
gpt4 key购买 nike

我有一个界面:

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)
}

并且我有3个struct接口(interface)兼容。所有三个结构都有相同的方法 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”和“code3”是完全一样的。有没有减少重复代码的好方法?例如。定义一次函数并将其分配给三个结构?

最佳答案

将其包装在自己的类型中。还要记住 Go 中的接口(interface)应该只为小的特定任务提供契约。一个接口(interface)只包含一个方法是很常见的。

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

关于go - 对于给定的接口(interface),我有三个实现。三个实现如何共享相同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com