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