问题:对于golang项目中,随着项目的迭代,对于某个方法,如果原有的参数不够用,需要添加新的参数,又不想修改所有调用的地方
。如何做才能更好的扩展?
这里提供一种方法:
注:如果能不新增参数最好不要新增
1、原有方法,例如:
func Mytest(arg1 string, arg2 int64){
fmt.Println(arg1, arg2)
}
2、添加参数 args ...interface{} , 注:添加使用三个点的参数,以前的方法是不需要修改的,不会报错,相当于三个点参数args默认值是interface{}的切片。
func Mytest(arg1 string, arg2 int64, args ...interface{}){
fmt.Println(arg1, arg2, args)
}
3、到此其实已经实现了新增参数,但是不好用而已,随着项目迭代args会变得无法区分。我们希望有个key能做区分,所以定义个 ExtArgF 方法,如:
type ExtArgF func() (k string, v interface{})
func Mytest(arg1 string, arg2 int64, args ...ExtArgF){
fmt.Println(arg1, arg2)
for _, arg := range args{
if k, v := arg(); k == "test1"{
v1 := v.([]int64)
fmt.Println(1, v1[0])
}else if k == "test2" {
v1 := v.([]string)
fmt.Println(2, v1[0])
}
}
}
4、这样以后迭代就可以添加若干个参数了,使用示例:
var extArg1 ExtArgF = func()(k string, v interface{}){
return "test1", append([]int64{1}, 2)
}
var extArg2 ExtArgF = func()(k string, v interface{}){
return "test2", append([]string{"xx"}, "ss", "2")
}
Mytest("1", 1, extArg1, extArg2)
5、还是那句话,如果有不新增参数的方法最好不新增
有疑问加站长微信联系(非本文作者)