package main
import"fmt"// Usb 结构体type Usb struct{
Name string}// Myprint1 该方法判断不同的数据类型funcMyprint1(x interface{}){if v, ok := x.(string); ok {
fmt.Println("string类型!值为:", v)}elseif v, ok := x.(int); ok {
fmt.Println("int类型!值为:", v)}elseif v, ok := x.(bool); ok {
fmt.Println("bool类型!值为:", v)}elseif v, ok := x.([]int); ok {
fmt.Println("切片类型!值为:", v)}elseif v, ok := x.(Usb); ok {
fmt.Println("自定义的Usb结构体类型!", v)}else{
fmt.Println("断言失败!")}}// Myprint2 该方法判断不同的数据类型funcMyprint2(x interface{}){// x.(type)类型断言只能用于switch语句switch x.(type){caseint:
fmt.Println("int类型")casestring:
fmt.Println("string类型")casebool:
fmt.Println("bool类型")default:
fmt.Println("断言失败!")}}funcmain(){// a表示任意数据类型var a interface{}// 用类型断言确定a到底取何种类型 变量名.()
a ="Golang"
v, ok := a.(string)if ok {
fmt.Println("是string类型!值是:", v)}else{
fmt.Println("不是string类型!", v)}Myprint1([]int{1,2,3,4})Myprint2(3)var u = Usb{
Name:"usb测试!",}// 用空接口表示map存任意类型的值var m1 =make(map[string]interface{})
m1["name"]="why"
m1["age"]=19
m1["sex"]=true
m1["usb"]= u
fmt.Println(m1)// 用空接口实现存储任意类型的切片var c =[]interface{}{1,"why",true}
fmt.Println(c)// 但是用空接口实现的任意类型切片或任意类型map数据类型无法获取到其中的结构体或切片的内部值// 所以需要用到类型断言来取值// fmt.Println(m1["usb"].Name) // 这样取值会报错 type interface {} is interface with no methods
n, ok := m1["usb"].(Usb)
fmt.Print(n.Name)}