我有一个应该执行类似操作的功能
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]
所有重置完全相同,任何想法如何组合而又不删除函数之外的那些行。
也许带有附加参数....
答案 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.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
}