Go语言 可变参数(变参函数)

  合适地使用可变参数,可以让代码简单易用,尤其是输入输出类函数,比如日志函数等。

  本文主要从4个实例介绍可变参数用法。

  程序代码:

package main

import (
    "bytes"
    "fmt"
)

/****************** 1 ****************
定义可参变数函数
形如...type格式的类型只能作为函数的参数类型存在,
并且必须是最后一个参数,它是一个语法糖(syntactic sugar),
即这种语法对语言的功能并没有影响,但是更方便程序员使用,
通常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的可能
*/
func myfunc(args ...int) {
    for _, v := range args {
        fmt.Println(v)
    }
}

/****************** 2 ****************
任意类型的可变参数
用 interface{} 传递任意类型数据是Go语言的惯例用法,使用 interface{} 仍然是类型安全的
*/
func MyPrintf(args ...interface{}) {
    for _, arg := range args {
        switch arg.(type) {
        case int:
            fmt.Println(arg, "is an int value.")
        case string:
            fmt.Println(arg, "is an string value.")
        case int64:
            fmt.Println(arg, "is an int64 value.")
        default:
            fmt.Println(arg, "is an unknown value.")
        }

    }
}

/****************** 3 ****************
遍历可变参数列表——获取每一个参数的值
*/
func JoinStrings(slist ...string) string {
    //定义 一个字节缓冲,快速连接字符串
    var b bytes.Buffer
    for _, s := range slist {
        //将遍历的字节字符串写入字节数组
        b.WriteString(s)

    }
    //将连接好的字节数组转为字符串
    return b.String()
}

func rawPrint(slst ...interface{}) {
    for _, v := range slst {
        fmt.Println(v)
    }
}

/****************** 4 ****************
在多个可变参数函数中传递参数
如果要将这个含有可变参数的变量传递给下一个可变参数函数,可以在传递时给可变参数变量后面添加...
*/
func personPrint(slst ...interface{}) {
    rawPrint(slst...)
}

func main() {

    //定义可参变数函数
    myfunc(1, 7, 5)

    var v1 int = 1
    var v2 int64 = 234
    var v3 string = "hello"
    var v4 float32 = 1.23
    //任意类型的可变参数
    MyPrintf(v1, v2, v3, v4)
    //遍历可变参数列表——获取每一个参数的值
    fmt.Println(JoinStrings("ladies ", "and ", "gentlemen"))
    //在多个可变参数函数中传递参数
    personPrint(1, 3, 5)
}

  程序输出:

1
7
5
1 is an int value.
234 is an int64 value.
hello is an string value.
1.23 is an unknown value.
ladies and gentlemen
1
3
5

原文地址:https://www.cnblogs.com/personblog/p/12319366.html

时间: 2024-10-29 04:36:38

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

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

转:C语言 可变参数

C语言 可变参数 堆栈一般是怎么压栈处理的 /* * stack space: * *        参数3   |    up *        参数2   | *        参数1   v    down */ 因为参数是按照从右向左依次压入的,所以后面参数的地址依次根据“%”处理即可.文章中start = (int*) &buffer即获取了最后入栈的参数地址(如果最后一个入栈参数为int类型,自己可以推算出倒数第二个参数的地址.) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  

C语言——可变参数

http://blog.chinaunix.net/space.php?uid=25304914&do=blog&id=3066441 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点&

C语言可变参数在宏定义中的应用

在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)

C语言可变参数

转自http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html,稍有改动 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三

c语言可变参数函数

c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a, int b, int c); 如果知道了参数a的地址,那么,可以推导出b,c的地址 #include <stdio.h> void test(int a, int b, int c) { printf("%p, %p, %p\n", &a, &b, &

c语言 可变参数的使用

主要涉及函数 va_list ap     声明一个指针 va_start(ap,arg)     将ap指向到最后一个确定的参数arg va_arg(ap,size)       将ap储存的地址加size,指向下一个参数 va_end(ap)          将ap赋值为NULL #include<stdarg.h> #include<stdio.h> int sum(int, ...); int main(void) { printf("Sum of 10, 20

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 *format, ...); 后面的三个点...

c语言可变参数列表处理

函数参数的传递原理 函数参数在内存中是以栈的形式存取,从右至左入栈. 参数在内存中存放格式: 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减. 总之,函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段.堆栈中,各个函数的分布情况是倒叙的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的 分布情况如