本文摘自php中文网,作者silencement,侵删。
golang的可变参数
可变参数就是一个占位符,你可以将1个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处
理,我们看一下可变参数的声明:
1 2 |
|
可变参数使用name ...Type的形式声明在函数的参数列表中,而且需要是参数列表的最后一个参数,这点与其他语言类似;
可变参数在函数中将转换为对应的[]Type类型,所以我们可以像使用slice时一样来获取传给函数的参数们;
有一点值得注意,golang的可变参数不需要强制绑定参数的出现。
举个例子,我想在c语言中实现一个求和任意个整数的函数sum:
1 2 3 |
|
我们只有先指定至少一个固定的形参(num)才能使用...可变参数,在golang中是不需要这样做的:
1 2 3 |
|
这也是golang语法简洁的其中一个体现。
传递参数给...可变参数
传递参数给带有可变参数的函数有两种形式,第一种与通常的参数传递没有什么区别,拿上一节的sum举个例子:
1 2 |
|
除了参数的个数是动态变化的之外和普通的函数调用是一致的。
第二种形式是使用...运算符以变量...的形式进行参数传递,这里的变量必须是与可变参数类型相同的slice,而不能是其他类型(没错,
数组也不可以),看个例子:
1 2 |
|
这种形式最常用的地方是在内置函数append里:
1 2 3 |
|
是不是和python的解包操作很像,没错,大部分情况下你可以把...运算符当做是golang的unpack操作,不过有几点不同还是要注意
的:
第一,只能对slice类型使用...运算符:
1 2 |
|
你会见到这样的报错信息:
1 |
|
这是因为可变参数实际是个slice,...运算符是个语法糖,它把前面的slice直接复制给可变参数,而不是先解包成独立的n个参数再传
递,这也是为什么我只说...运算符看起来像unpack的原因。
第二个需要注意的地方是不能把独立传参和...运算符混用,再看个例子:
1 2 |
|
这次你会见到一个比较长的报错:
1 2 3 |
|
这是和前面所说的原因是一样的,...运算符将不定参数直接替换成了slice,这样就导致前一个独立给出的参数不再算入可变参数的范围
内,使得函数的参数列表从(...int)变成了(int, ...int),最终使得函数类型不匹配编译失败。
正确的做法也很简单,不要混合使用...运算符给可变参数传参即可。
读了这篇文章,再加上一些简单的联系,我相信你们一定也能掌握golang可变参数的使用。
以上就是golang如何传不定参数的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
更多相关阅读请进入《不定参数》频道 >>

Go语言101
一个与时俱进的Go编程知识库。