将动态参数传递给函数

时间:2019-03-06 14:53:07

标签: go

我有一个应该执行类似操作的功能


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 个答案:

答案 0 :(得分:3)

一个选项是将公共部分移至另一个功能,例如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.Beforem.BuildParams.After是同一类型(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
}