🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 类型断言 接口类型向普通接口类型转换,就是类型断言。判断 X 的类型是否是 T >**t, ok := X.(T)** X,接口变量 T,接口类型(string,int,bool)等 断言成功ok = true,值t = X 只有断言成功,才能输入值 断言失败 ok = false,值t = (空的) ``` package main import "fmt" func checkType(t interface{}, ok bool) { if ok { fmt.Println("断言成功", ok) } else { fmt.Println("断言失败", ok) } fmt.Printf("变量T的类型= %T,值 = %v", t, t) } func main() { var x interface{} = 1 t, ok := x.(int) checkType(t, ok) } 结果: 断言成功 true 变量T的类型= int,值 = 1 ``` ``` package main import "fmt" func main() { var x interface{} = 1 t, ok := x.(int) fmt.Println(t, ok) } 结果: 1 true ``` 如果断言类型T是一个具体的类型,比如int,类型断言就会X.(T)就会检查X的动态类型是否和T相同。 如果断言的类型T是一个接口类型,类型断言X.(T) 检查X的动态类是否满足T接口 注意: 结构体里面一个变量,方法传参不要*,比如(d *Datalist) 和(d Datalist) ``` package main import "fmt" // 创建一个接口类型 type Data interface { Sing() } // 创建一个结构体 type Datalist struct { Name string } // 方法 func (d Datalist) Sing() { fmt.Println(d.Name, "会唱歌") } // 断言 func checkType(t interface{}, ok bool) { if ok { fmt.Println("断言成功", ok) } else { fmt.Println("断言失败", ok) } fmt.Printf("变量t的类型是 %T,值%v\r\n", t, t) } func main() { //实例化结构体 var 变量名 接口名 = &结构体名{} var d Data = &Datalist{"Pony"} fmt.Println(d) d.Sing() // 第一次类型断言 var s interface{} = Datalist{"Pony"} t, ok := s.(string) checkType(t, ok) //第二次类型断言 t1, ok := s.(Data) checkType(t1, ok) } 结果: &{Pony} Pony 会唱歌 断言失败 false 变量t的类型是 string,值 断言成功 true 变量t的类型是 main.Datalist,值{Pony} ```