Перейти к передаче динамического параметра функции

#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:

Один из вариантов — переместить общую часть в другую функцию, например, 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 имеют один и тот же тип (будь то 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
}