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

相关推荐