ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 类型转换和断言 类型转换和断言本质上是不同,虽然都是起到转换类型的作用. 1. 类型转换多是将一种已知类型转换成其它类型,如数值1转成字符串"1" ; 2. 断言V.(I) ,v是接口值,I是接口类型,用于判断某个接口值的类型是否为某个类型. ## 断言一个返回值 ~~~ var num interface{} //空接口,所有类型的顶级类型 num = 10 n := num.(int) //断言是int,那么成功后,那么n就是变成int类型的10 fmt.Printf("%T\n", n) fmt.Println(n) ~~~ ``` int 10 ``` ## 断言两个返回值 ~~~ var num interface{} num = 10 n, ok := num.(int) //ok中是bool值,true或false if ok { fmt.Println("断言正确") } s, ok := num.(string) if ok { fmt.Println("断言正确") } else { fmt.Println("断言错误") } fmt.Printf("%T\n", n) fmt.Println(n) fmt.Println(s) ~~~ ``` 断言正确 断言错误 int 10 "" ``` ## defer不可以在循环中使用 我们常常使用defer来释放句柄或者资源. 但是在循环中严禁这么使用. 因为defer是在循环语句全部执行完才执行的. 这样的情况就是会占用大量的资源不释放.导致崩溃; ~~~ for i := 0; i < 10; i++ { defer show(i) } func show(n int) { fmt.Println(n) } ~~~ 可以看到是从9开始打印到0,这说明是for循环全部执行完之后才开始执行defer: ``` 9 8 7 6 5 4 3 2 1 0 ```