golang变参函数
什么是变参函数?
变参函数是指可以接受可变数量的参数的函数。
语法
如果一个函数的最后一个参数由...T
表示,则表示该函数可以接受任意数量的类型为T
的参数。
请注意只有函数的最后一个参数才能指定为可变参数。
例子
你有没有想过为什么append函数可以将任意数量的值追加到切片末尾?这是因为它是一个变参函数。append
的原型为funcappend(slice[]Type,elems...Type)[]Type
,其中elems
是一个可变参数。
让我们来创建一个自己的变参函数。我们将编写一个程序来判断某个特定整数是否包含在某个整数列表中。
packagemain import( "fmt" ) funcfind(numint,nums...int){ fmt.Printf("typeofnumsis%T\n",nums) found:=false fori,v:=rangenums{ ifv==num{ fmt.Println(num,"foundatindex",i,"in",nums) found=true } } if!found{ fmt.Println(num,"notfoundin",nums) } fmt.Printf("\n") } funcmain(){ find(89,89,90,95) find(45,56,67,45,90,109) find(78,38,56,98) find(87) } 123456789101112131415161718192021222324252627
上面的程序中,funcfind(numint,nums...int)
可以接受任意数量的参数。...int
在内部表示为切片。在这里nums
的类型为[]int
。
第10行利用rangefor遍历nums
切片,如果找到num
则打印num
所在位置,否则打印没有找到。
上面的程序输出如下:
typeofnumsis[]int
89foundatindex0in[899095]
typeofnumsis[]int
45foundatindex2in[56674590109]
typeofnumsis[]int
78notfoundin[385698]
typeofnumsis[]int
87notfoundin[]1234567891011
在第25行,find
只有一个参数。我们没有传递任何参数给nums...int
。这是合法的,(译者注:如果没有给可变参数传递任何值,则可变参数为nil切片),在这里nums
是一个nil
切片,长度和容量都是0。
传递切片给可变参数
我们已经提到...T
在内部表示为类型是[]T
切片。如果真是这样,可以传递一个切片给可变参数吗?让我们从下面的例子中寻找答案:
packagemain import( "fmt" ) funcfind(numint,nums...int){ fmt.Printf("typeofnumsis%T\n",nums) found:=false fori,v:=rangenums{ ifv==num{ fmt.Println(num,"foundatindex",i,"in",nums) found=true } } if!found{ fmt.Println(num,"notfoundin",nums) } fmt.Printf("\n") } funcmain(){ nums:=[]int{89,90,95} find(89,nums) }123456789101112131415161718192021222324
在第23行,我们没有将若干数量的参数传递给find
的最后一个参数,而是传递了一个切片。这是非法的,我们不能传递一个切片给可变参数。上面的程序将报错:main.go:23:cannotusenums(type[]int)astypeintinargumenttofind
。
这里有一个语法糖可以用来将切片传递给变参函数。可以在切片后面加...
,这样会将切片展开为其中的各个元素并将它们传递给变参函数。这样该程序将正常工作。
上面的程序如果将第23行的find(89,nums)
改为find(89,nums...)
,程序将通过编译,并输出如下:
typeofnumsis[]int
89foundatindex0in[899095]
原文链接: