1。介绍Go语言中函数的最后一个参数可以是变长参数。细心的读者可能已经发现,在Go语言标准库的fmt包中使用了变长参数函数,例如Println和Printf。我们在使用Go语言开发应用的时候,也可以在合适的场景下使用变长参数函数,让我们的代码更加优雅。2.变长参数顾名思义,变长参数就是参数的个数不固定,可以是0个、1个或多个。变长参数的格式为...T,共有3个。参数类型前,表示该参数为变长参数。变长参数是函数体中slice类型的参数,也就是说...T等价于[]T。变长参数在函数外可以匹配的参数类型有两种,一种是[]T切片类型的变量,另一种是T类型的多个变量,两者不能同时使用,也就是说,它们不能同时出现在函数的参数列表中。3、变长参数函数我们已经知道什么是变长参数,那么自然而然地我们可以把接受形参形式为...T的函数看作是变长参数函数。一个可变参数函数只能有一个...T形式的形式参数,并且这个形式参数必须是函数参数列表中的最后一个形式参数。需要注意的是,变长参数函数最容易“坑”的就是形参和实参的类型不匹配,比如下面的代码:funcsum(args...interface{}){res:=0for_,v:=rangeargs{res+=v.(int)}fmt.Println(res)}funcmain(){num:=[]int{1,2,3}sum(num...)}Outputresult:./prog.go:18:6:cannotusenum(variableoftype[]int)astype[]interface{}inargumenttosum阅读上面的代码,我们发现程序的原因runningerror是实现参数类型和形参类型不一致,导致编译错误。有些读者可能会感到困惑。int类型的变量可以直接赋值给interface{}类型的变量。为什么会出现错误?这是因为实参的类型是[]int,无法匹配形参[]interface{}。修复这个错误也很简单,将实参的类型改为[]interface{}即可。num:=[]interface{}{1,2,3}4.使用场景我们在了解了变长参数和变长参数函数后,通过一个示例代码来加深读者朋友的理解。使用场景是调用下游方法输入用户个人资料。但是后来调用的下游方法的入参发生了变化,增加了一个或多个请求参数。如果不使用变长参数,我们调用下游方法的原始代码需要做相应的修改。这是示例代码:更改前的示例代码:funcCallUserCenter(namestring,ageint,genderstring)(detail*User,errerror){detail,err=NewUserUsecase().Create(name,age,gender)iferr!=nil{return}return}更改示例代码:funcCallUserCenter(namestring,ageint,genderstring,args...interface{})(detail*User,errerror){iflen(args)==0{detail,err=NewUserUsecase().Create(name,age,gender)}else{detail,err=NewUserUsecase().Create(name,age,gender,args[0])}iferr!=nil{返回}返回}调用函数的示例代码:funcmain(){name:="frank"age:=18gender:="male"detail,err:=CallUserCenter(name,age,gender)iferr!=nil{fmt.Printf("err=%v\n",err)return}fmt.Printf("姓名:%s\nage:%d\ngender:%s\n",detail.name,detail.age,detail.gender)fmt.Printf("%s\n","********************")name2:="lucy"age2:=17gender2:="female"salary2:=5000detail2,err:=CallUserCenter(name2,age2,gender2,salary2)iferr!=nil{fmt.Printf("err=%v\n",err)return}fmt.Printf("name:%s\nage:%d\ngender:%s\nsalary:%d\n",detail2.name,detail2.age,detail2.gender,detail2.salary)}读取在上面的代码中,因为我们使用了变长参数来修改被调用的下游函数的入参,即将原来调用的下游函数从一个普通函数变成了一个变长参数函数。通过以这种方式更改代码,不仅功能预期的功能没有破解以前的调用代码。5.小结本文主要介绍Go语言中变长参数函数的使用方法。首先介绍了变长参数和变长参数函数的相关知识,然后列举了一个简单的例子。通过示例代码,读者朋友们可以加深理解。有兴趣的读者,不妨看看自己的项目中是否有适合使用变长参数函数的场景,并尝试重构相关代码。
