将动态参数传递给函数

我有一个函数应该做这样的事情



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]

所有的重置都是完全一样的,知道如何在不删除函数外的那些行的情况下将它们组合起来……。


也许有额外的参数....


皈依舞
浏览 138回答 1
1回答

慕虎7371278

一种选择是将公共部分移动到另一个函数,例如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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go