Go语言 使用反射的重构方法

ovfsdjhp  于 2023-03-06  发布在  Go
关注(0)|答案(1)|浏览(155)

假设我有两个结构体

type A struct {
}

func (a *A) SomeFunc (s string) {
    // some codes
}

func (a *A) ProcessRequest(funcName string, parameters map[string]*structpb.Value) error {
    ...
    if method := reflect.ValueOf(a).MethodByName(funcName); method.IsValid()
    ...
        values := make([]reflect.Value, 0)
        ...
        rv := method.Call(values)
        ...
}

type B struct {
}

func (b *B) AnotherFunc (i int) {
    //somecode
}

我正在使用反射来调用A中的方法,A是SomeFunc,它工作得很好。
现在我需要写一个结构体B,它也有ProcessRequest,它的代码和A中的完全一样。
有什么办法可以重构它吗?
我试着去创造

type ProcessProvider struct{
}

并且让A和B嵌入它,但是当调用该方法时,* ProcessProvider作为接收方被传递,并且它找不到SomeFuncAnotherFunc
一种接口

type ProcessProvider interface {
    ProcessRequest(serviceName string, parameters map[string]*structpb.Value) error
}

是有帮助的,但我仍然要复制粘贴代码。

3pmvbmvn

3pmvbmvn1#

ProcessRequest必须是这些结构体的成员吗?
如果没有这样的要求,您可以断开此方法与结构的连接,并接受结构作为参数。

func ProcessRequest(a any, funcName string, parameters map[string]*structpb.Value) error {
    ...
    if method := reflect.ValueOf(a).MethodByName(funcName); method.IsValid()
    ...
        values := make([]reflect.Value, 0)
        ...
        rv := method.Call(values)
        ...
}

相关问题