登录
首页 >  Golang >  Go问答

重构方法中使用的反射技术

来源:stackoverflow

时间:2024-02-15 23:45:21 262浏览 收藏

大家好,我们又见面了啊~本文《重构方法中使用的反射技术》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

假设我有两个结构,它们是

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 中的方法,即 somefunc 并且运行良好。

现在我需要编写一个结构体 b,它也有 processrequest,它的代码与 a 中的代码完全相同。

我可以重构这个吗?

我尝试过创建

type processprovider struct{
}

并让a和b嵌入它,但是当调用该方法时,*processprovider作为接收者传递,并且找不到somefuncanotherfunc

接口

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

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


正确答案


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

好了,本文到此结束,带大家了解了《重构方法中使用的反射技术》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>