先体验一下简单的类型断言
由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。
思考
任何类型都可以赋值给空接口,空接口怎么赋值给具体类型呢?
代码
package main
import (
"fmt"
)
func main() {
// 类型断言 float32 - interface{}
var m float32
// 定义空接口
var x interface{}
x = m
fmt.Printf("x 类型: %T, 值: %v \n", x, x)
// x 类型: float32, 值: 0
n := x.(float32)
fmt.Printf("n 类型: %T, 值: %v \n", n, n)
// n 类型: float32, 值: 0
// 带检测的类型断言
n2, ok := x.(float32)
if ok {
fmt.Println("convert success")
fmt.Printf("n2 类型: %T, 值: %v \n", n2, n2)
} else {
fmt.Println("convert error")
}
// panic: interface conversion: interface {} is float32, not float64
/* if n2, ok := x.(float64); ok {
} */
fmt.Println("panic 之后还会执行吗")
}
类型断言最佳实践
说明
循环判断传入参数的类型
代码
// 编写函数,判断参数是什么类型
package main
import (
"fmt"
)
// 定义 Student 类型
type Student struct{}
// 可以接收多个不同类型的参数
func JudgeType(items ...interface{}) {
for i, v := range items {
i = i + 1
// 类型断言
switch v.(type) {
case bool:
fmt.Printf("第%v个参数是 bool 类型,值:%v \n", i, v)
case float32:
fmt.Printf("第%v个参数是 float32 类型,值:%v \n", i, v)
case float64:
fmt.Printf("第%v个参数是 float64 类型,值:%v \n", i, v)
case int, int16, int32, int64:
fmt.Printf("第%v个参数是 整数 类型,值:%v \n", i, v)
case string:
fmt.Printf("第%v个参数是 string 类型,值:%v \n", i, v)
case Student:
fmt.Printf("第%v个参数是 Student 类型,值:%v \n", i, v)
case *Student:
fmt.Printf("第%v个参数是 *Student 类型,值:%v \n", i, v)
default:
fmt.Printf("第%v个参数类型不确定,值:%v \n", i, v)
}
}
}
func main() {
var n1 float32 = 1.1
var n2 float64 = 2.1
var name string = "tom"
address := "北京"
n3 := 64
stu1 := Student{}
stu2 := &Student{}
var a interface{}
var b *interface{}
JudgeType(n1, n2, name, address, n3, stu1, stu2, a, b)
fmt.Printf("a 类型: %T, 值: %v \n", a, a) // a 类型: <nil>, 值: <nil>
fmt.Printf("b 类型: %T, 值: %v \n", b, b) // b 类型: *interface {}, 值: <nil>
}
上面代码输出结果
第1个参数是 float32 类型,值:1.1
第2个参数是 float64 类型,值:2.1
第3个参数是 string 类型,值:tom
第4个参数是 string 类型,值:北京
第5个参数是 整数 类型,值:64
第6个参数是 Student 类型,值:{}
第7个参数是 *Student 类型,值:&{}
第8个参数类型不确定,值:<nil>
第9个参数类型不确定,值:<nil>
a 类型: <nil>, 值: <nil>
b 类型: *interface {}, 值: <nil>
🎈🎈🎈
🎉 喜欢的小伙伴可以点赞收藏关注
✨ 欢迎大家转发评论交流, 蟹蟹😊
👉 gitHub代码