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类型