189 8069 5689

go语言实现传不定参数的方法-创新互联

这篇文章为大家带来有关go语言实现传不定参数的方法详细介绍。大部分知识点都是大家经常用到的,为此分享给大家做个参考。一起跟随小编过来看看吧。

创新互联企业建站,十多年网站建设经验,专注于网站建设技术,精于网页设计,有多年建站和网站代运营经验,设计师为客户打造网络企业风格,提供周到的建站售前咨询和贴心的售后服务。对于成都网站设计、网站制作中不同领域进行深入了解和探索,创新互联在网站建设中充分了解客户行业的需求,以灵动的思维在网页中充分展现,通过对客户行业精准市场调研,为客户提供的解决方案。

golang的可变参数

可变参数就是一个占位符,你可以将1个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处

理,我们看一下可变参数的声明:

func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

可变参数使用name ...Type的形式声明在函数的参数列表中,而且需要是参数列表的最后一个参数,这点与其他语言类似;

可变参数在函数中将转换为对应的[]Type类型,所以我们可以像使用slice时一样来获取传给函数的参数们;

有一点值得注意,golang的可变参数不需要强制绑定参数的出现。

举个例子,我想在c语言中实现一个求和任意个整数的函数sum:

int sum(int num, ...) {
    // todo
}

我们只有先指定至少一个固定的形参(num)才能使用...可变参数,在golang中是不需要这样做的:

func sum(nums ...int) int {
    //todo
}

这也是golang语法简洁的其中一个体现。

传递参数给...可变参数

传递参数给带有可变参数的函数有两种形式,第一种与通常的参数传递没有什么区别,拿上一节的sum举个例子:

sum(1, 2, 3)
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

除了参数的个数是动态变化的之外和普通的函数调用是一致的。

第二种形式是使用...运算符以变量...的形式进行参数传递,这里的变量必须是与可变参数类型相同的slice,而不能是其他类型(没错,

数组也不可以),看个例子:

numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sum(numbers...) // 和sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10)等价

这种形式最常用的地方是在内置函数append里:

result := []int{1, 3}
data := []int{5, 7, 9}
result = append(result, data...) // result == []int{1, 3, 5, 7, 9}

是不是和python的解包操作很像,没错,大部分情况下你可以把...运算符当做是golang的unpack操作,不过有几点不同还是要注意

的:

第一,只能对slice类型使用...运算符:

arr := [...]int{1, 2, 3, 4, 5}
sum(arr...) // 编译无法通过

你会见到这样的报错信息:

cannot use arr (type [5]int) as type []int in argument to sum

这是因为可变参数实际是个slice,...运算符是个语法糖,它把前面的slice直接复制给可变参数,而不是先解包成独立的n个参数再传

递,这也是为什么我只说...运算符看起来像unpack的原因。

第二个需要注意的地方是不能把独立传参和...运算符混用,再看个例子:

slice := []int{2, 3, 4, 5}
sum(1, slice...) // 无法通过编译

这次你会见到一个比较长的报错:

too many arguments in call to sum
    have (number, []int...)
    want (...int)

这是和前面所说的原因是一样的,...运算符将不定参数直接替换成了slice,这样就导致前一个独立给出的参数不再算入可变参数的范围

内,使得函数的参数列表从(...int)变成了(int, ...int),最终使得函数类型不匹配编译失败。

正确的做法也很简单,不要混合使用...运算符给可变参数传参即可。

到此为止, 关于go语言实现传不定参数的方法有了一个基础的认识, 但是对于具体的使用方法还是需要多加巩固和练习,如果想了解更多相关内容,请关注创新互联成都网站设计公司行业资讯。!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站题目:go语言实现传不定参数的方法-创新互联
分享路径:http://cdxtjz.com/article/igjeo.html

其他资讯