### 类型断言
接口类型向普通接口类型转换,就是类型断言。判断 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}
```
- 安装开发环境
- 安装开发环境
- 安装详细教程
- 引入包
- Go语言基础
- 基本变量与数据类型
- 变量
- 数据类型
- 指针
- 字符串
- 代码总结
- 常量与运算符
- 常量
- 运算符
- 流程控制
- if判断
- for循环
- switch分支
- goto跳转
- 斐波那契数列
- Go语言内置容器
- 数组
- 切片
- 映射
- 函数
- 函数(上)
- 函数(中)
- 函数(下)
- 小节
- 包管理
- 结构体
- 结构体(上)
- 结构体(中)
- 结构体(下)
- 小节
- 错误处理
- 错误处理
- 宕机
- 错误应用
- 小节
- 文件操作
- 获取目录
- 创建和删除目录
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 处理JSON文件
- 接口与类型
- 接口的创建与实现
- 接口赋值
- 接口嵌入
- 空接口
- 类型断言(1)
- 类型断言(2)
- 小节
- 并发与通道
- goroutine协程
- runtime包
- 通道channel
- 单向通道channel
- select
- 线程同步
- 多线程的深入学习
- http编程
- http简介
- Client和Request
- get请求
- post请求
- 模块函数方法
- 模块
- fmt库,模块
- 项目练习
- 爬虫:高三网
- 爬虫:快代理
- 爬虫:快代理2
- 多线程:通道思路
- 多线程爬虫:快代理