为了账号安全,请及时绑定邮箱和手机立即绑定

将动态参数传递给函数

将动态参数传递给函数

Go
皈依舞 2023-06-12 16:33:45
我有一个函数应该做这样的事情func getA(m *m.TSR, bl string) string {    runParams, exist := m.BuildParams.Before[bl]    if exist {        runParamsMap, ok := runParams.(map[interface{}]interface{})        if ok {            run, ok := runParamsMap["builder"]            if ok {                return run.(string)            }        }    }    return ""}func getB(m *m.TSR, bl string) string {    runParams, exist := m.BuildParams.After[bl]    if exist {        runParamsMap, ok := runParams.(map[interface{}]interface{})        if ok {            run, ok := runParamsMap["builder"]            if ok {                return run.(string)            }        }    }    return ""}这两个函数都按预期工作,但我想知道是否有一种方法可以只使用一个处理相同的函数?唯一的区别是之前和之后m.BuildParams.Before[bl]m.BuildParams.After[bl]所有的重置都是完全一样的,知道如何在不删除函数外的那些行的情况下将它们组合起来……。也许有额外的参数....
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

一种选择是将公共部分移动到另一个函数,例如get(),并更改getA()并getB()调用它get():


func getB(m *m.TSR, bl string) string {

    runParams, exist := m.BuildParams.Before[bl]

    return get(runParams, exist)

}


func getB(m *m.TSR, bl string) string {

    runParams, exist := m.BuildParams.After[bl]

    return get(runParams, exist)

}


func get(runParams interface{}, exists bool) string {

    if exist {

        runParamsMap, ok := runParams.(map[interface{}]interface{})

        if ok {

            run, ok := runParamsMap["builder"]

            if ok {

                return run.(string)

            }

        }

    }

    return ""

}

如果m.BuildParams.Before和m.BuildParams.After属于同一类型(是 it commonType),您可以做得更好:


func getA(m *m.TSR, bl string) string {

    return get(m.BuildParams.Before, bl)

}


func getB(m *m.TSR, bl string) string {

    return get(m.BuildParams.After, bl)

}

只有第一行发生了变化get():


func get(common commonType, bl string) string {

    runParams, exist := common[bl]

    // rest is same

}


查看完整回答
反对 回复 2023-06-12

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信