检查接口对象的数据类型
func checkType(v interface{}) {
switch t := v.(type) {
case int:
fmt.Printf("int: %v\n", t)
case string:
fmt.Printf("string: %v\n", t)
default:
fmt.Printf("unkown\n")
}
}
func main() {
checkType(100) // int: 100
checkType("hello world") // string: hello world
checkType(true) // unkown
}
在程序中,首先定义了一个名为 checkType 的函数,该函数接受一个 interface{} 类型的参数 v。在函数中,程序使用了 switch 语句对参数 v 的类型进行判断。如果参数 v 的类型是 int,程序输出一条消息,指示参数的类型为 int,并输出参数的值。如果参数 v 的类型是 string,程序输出一条消息,指示参数的类型为 string,并输出参数的值。如果参数 v 的类型不是 int 或 string,程序输出一条消息,指示参数的类型为 unknown。
在主函数中,程序分别调用了 checkType 函数,并向其传递了不同类型的参数。第一次调用 checkType 函数时,程序向其传递了一个整型数值 100。由于这个参数的类型是 int,因此程序会输出一条消息,指示参数的类型为 int,并输出参数的值。第二次调用 checkType 函数时,程序向其传递了一个字符串 "hello world"。由于这个参数的类型是 string,因此程序会输出一条消息,指示参数的类型为 string,并输出参数的值。第三次调用 checkType 函数时,程序向其传递了一个布尔型数值 true。由于这个参数的类型不是 int 或 string,因此程序会输出一条消息,指示参数的类型为 unknown。
检查结构体是值还是引用
type person struct {
name string
age int
}
func checkType(v interface{}) {
switch t := v.(type) {
case person:
fmt.Printf("person value: %v\n", t)
case *person:
fmt.Printf("person reference: %v\n", t)
default:
fmt.Printf("unkonwn\n")
}
}
func main() {
p1 := person{"zhangsan", 20}
p2 := &person{"zhangsan", 20}
checkType(p1) // person value: {zhangsan 20}
checkType(p2) // person reference: &{zhangsan 20}
checkType(struct{}{}) // unkonwn
}
在程序中,首先定义了一个名为 person 的结构体,该结构体包含两个字段,分别是名字和年龄。然后,定义了一个名为 checkType 的函数,该函数接受一个 interface{} 类型的参数 v。在函数中,程序使用了 switch 语句对参数 v 的类型进行判断。如果参数 v 的类型是 person,程序输出一条消息,指示参数的类型为 person,并输出参数的值。如果参数 v 的类型是 *person,程序输出一条消息,指示参数的类型为 person reference,并输出参数的值的地址。如果参数 v 的类型不是 person 或 *person,程序输出一条消息,指示参数的类型为 unknown。
在主函数中,程序分别创建了一个 person 类型的变量 p1 和一个指向 person 类型变量的指针 p2。然后,程序分别调用了 checkType 函数,并向其传递了不同类型的参数。第一次调用 checkType 函数时,程序向其传递了变量 p1。由于这个参数的类型是 person,因此程序会输出一条消息,指示参数的类型为 person,并输出参数的值。第二次调用 checkType 函数时,程序向其传递了变量 p2。由于这个参数的类型是 *person,因此程序会输出一条消息,指示参数的类型为 person reference,并输出参数的值的地址。第三次调用 checkType 函数时,程序向其传递了一个空结构体类型的变量。由于这个参数的类型不是 person 或 *person,因此程序会输出一条消息,指示参数的类型为 unknown。