Go中的可变参数--变参函数

1、可变参数类型

例子:

func Printf(format string, args ...interface{}) {
    // ...
}

interface{} 传递任意类型数据是Go语言的惯例用法,使用 interface{} 仍然是类型安全的,这和 C/C++ 不太一样,下面通过示例来了解一下如何分配传入 interface{} 类型的数据。

package main
import "fmt"
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 a string value.")
            case int64:
                fmt.Println(arg, "is an int64 value.")
            default:
                fmt.Println(arg, "is an unknown type.")
        }
    }
}
func main() {
    var v1 int = 1
    var v2 int64 = 234
    var v3 string = "hello"
    var v4 float32 = 1.234
    MyPrintf(v1, v2, v3, v4)
}

输出为:

1 is an int value.
234 is an int64 value.
hello is a string value.
1.234 is an unknown type.

遍历可变参数列表——获取每一个参数的值以及类型:
当可变参数为 interface{} 类型时,可以传入任何类型的值,此时,如果需要获得变量的类型,可以通过 switch 获得变量的类型,下面的代码演示将一系列不同类型的值传入 printTypeValue() 函数,该函数将分别为不同的参数打印它们的值和类型的详细描述。

package main

import (
    "bytes"
    "fmt"
)

func printTypeValue(slist ...interface{}) string {

    // 字节缓冲作为快速字符串连接
    var b bytes.Buffer

    // 遍历参数
    for _, s := range slist {

        // 将interface{}类型格式化为字符串
        str := fmt.Sprintf("%v", s)

        // 类型的字符串描述
        var typeString string

        // 对s进行类型断言
        switch s.(type) {
        case bool:    // 当s为布尔类型时
            typeString = "bool"
        case string:    // 当s为字符串类型时
            typeString = "string"
        case int:    // 当s为整型类型时
            typeString = "int"
        }

        // 写字符串前缀
        b.WriteString("value: ")

        // 写入值
        b.WriteString(str)

        // 写类型前缀
        b.WriteString(" type: ")

        // 写类型字符串
        b.WriteString(typeString)

        // 写入换行符
        b.WriteString("\n")

    }
    return b.String()
}

func main() {

    // 将不同类型的变量通过printTypeValue()打印出来
    fmt.Println(printTypeValue(100, "str", true))
}

结果为:

value: 100 type: int
value: str type: string
value: true type: bool

注意

在将可变类型的函数中的每个参数进行使用时,会发现由于传人的参数的类型是不固定的,因此在使用的时候需要对其中的参数的类型进行判别,除此之外也需要对参数的类型进行转换:当然,转换的前提是在知道数据类型的前提下,不知道的话可以通过类型断言进行判别。

例:

bs  := make(map[string]string)
bs["name"] = "张三"
bs["age"] = "12"
var student interface{}

student = bs
a := student.(map[string]string)  // 将interface类型转换为map类型

fmt.Printfln("姓名:",a["name"])
fmt.Printfln("数据:",a["age"])

注意:

a := student.(map[string]string)  // 将interface类型转换为map类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值