Go语言的可变(不定长)参数函数

一般情况一个函数的传入参数都是固定的,但是有一些函数能传入不定数量的参数(可变长的)。比如c语言中的printf。可以看:《C语言“…”占位符及可变参数函数

在Go语言中,也有这样的函数。用法类似,也是三个点。

可变参数函数声明:

1 // 这个函数可以传入任意数量的整型参数
2 func sum(nums ...int) {
3     fmt.Println(nums)
4     total := 0
5     for _, num := range nums {
6         total += num
7     }
8     fmt.Println(total)
9 }

这是可变参数的声明方式:

1 func Function(args …Type) {
2  
3 }

上面的三个点(…)就表示args是一个可变参数。在函数Function中,参数args是被当做一个slice来处理的。

可变参数函数的使用:

1 func main() {
2     sum(1, 2)
3     sum(1, 2, 3)
4 }

可变参数的用法和一般的参数一样,只是可以随意的指定参数的个数。

给可变参数函数传递数组:

当然,我们的参数可能本来就是一个slice,但是函数不允许传入参数。所以只能反过来,把slice打散传入给函数。

1 func main() {
2     // 如果你需要传入的参数在一个slice中,像下面一样
3     // "func(slice...)"把slice打散传入
4     nums := []int{1, 2, 3, 4}
5     sum(nums...)
6 }

使用时可变参数函数时可能遇到的错误:

这是我遇到的一个问题,在调用一个可变参数函数的时候。如果我把slice手动使用Function(slice[0],slice[1])这样传入,可以编译运行,但是如果我使用Function(slice …)就会爆如下错误。

1 cannot use args (type []string) as type []interface {} in function argument

相关代码:

01 package main
02  
03 import (
04     "fmt"
05     "flag"
06 )
07  
08 func main() {
09     flag.Parse()
10     fmt.Println(flag.Args()...)
11 }

这是我在stackoverflow找到的问题的原因。(上面你的代码也是stackoverflow的)

其实,从错误代码中也可以看出来,这是变量类型的问题。[]string和[]interface {}类型的问题。估计在使用Function(slice…)这种,打散数组传递时,函数是直接把slice传递进去,而不是像一般的用法那样,单个合并到slice里。string传递给ingerface{}类型的变量是允许的,但是[]string无法转换成[]interface {}类型。

对此,我们只能手动把[]string类型转换成[]interface {}类型,再传参。

1 old := flag.Args()
2 new := make([]interface{}, len(old))
3 for i, v := range old {
4     new[i] = interface{}(v)
5 }
6 fmt.Println(new...)

所以,解法就是写一个循环,把[]string类型转换成[]interface{}类型。

转载请注明:旅途@KryptosX » Go语言的可变(不定长)参数函数

时间: 2024-08-13 12:13:12

Go语言的可变(不定长)参数函数的相关文章

C++中的变长参数深入理解_C 语言

前言 在吸进的一个项目中为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的类都有默认构造函数,以及复制构造函数等.但使用共享内存和内存池的类可能没有默认构造函数,而是定义了多个参数的构造函数,于是如何将参数传入MemNew函数便成了问题. 一.变长参数函数 首先回顾一下较多使用的变长参数函数,最经典的便是printf. extern int printf(cons

J2SE5.0 实例---变长参数

j2se 变长参数(Varargs)与泛型一样,变长参数是C++中有而Java中没有的一种语言特性,在过去如果我们想向一个函数传递可变数量的函数,就必须首先将这些参数放入一个数组中,然后将数组传递给函数.就如同下面所作的一样: Object[] arguments = { 640, "kb", "anybody", "Bill Gates" }; String result = MessageFormat.format(      "{

[Lua]Lua语言基础汇总(4) -- 函数

Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: 1 2 3 function MyFunc(param)      -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么圆括号便可以省略掉.看以下代码: 1 2 3 4 5 6 print "Hello World"      

Python中函数的参数传递与可变长参数介绍

  这篇文章主要介绍了Python中函数的参数传递与可变长参数介绍,本文分别给出多个代码实例来讲解多种多样的函数参数,需要的朋友可以参考下 1.Python中也有像C++一样的默认缺省函数 代码如下: def foo(text,num=0): print text,num foo("asd") #asd 0 foo("def",100) #def 100 定义有默认参数的函数时,这些默认值参数 位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,

C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .

我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf():   Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( const char* format, ...); 它除了一个参数format固定外,后面的参数的个数和类型是不确定的,如下列三种调用方法: 1.    printf("%d\n", i); 2.    printf("%s\n", "Hello World

C语言“…”占位符及可变参数函数

C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数.事实上,C语言是提供任意数量参数的解决方案的. printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例. 1 printf("%d",x); 2 printf("%f",y); 3 printf("Hello my name is %s", name);

class-c语言定义一对一对的可变参数函数

问题描述 c语言定义一对一对的可变参数函数 fund(type_1 data_1 type_2 data_2 ...); 类似这样的函数怎样定义. 解决方案 http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html 解决方案二: 定义一个参数数组作为一个参数 解决方案三: typedef struct field_pad{ UINT1 type; UINT1 len; INT1 pad[62];}field_pad_t;

C语言中实现可变参数函数

通过stdarg.h头文件为函数提供了定义可变参数列表的能力.声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表.stdarg.h中提供了一个va_list类型,用于存放参数.一个大概的使用过程类似: void f1(int n,...) {    va_list ap;    va_start(ap,n);   //初始化参数列表    double first=va_arg(ap,double);  //取第一个参数  

C语言可变参数函数详解示例_C 语言

先看代码 复制代码 代码如下: printf("hello,world!");其参数个数为1个.printf("a=%d,b=%s,c=%c",a,b,c);其参数个数为4个. 如何编写可变参数函数呢?我们首先来看看printf函数原型是如何定义的.在linux下,输入man 3 printf,可以看到prinf函数原型如下: 复制代码 代码如下: SYNOPSIS#include <stdio.h>int printf(const char *form