1、什么是类型断言
- 由于 interface 是 一般类型,不是具体类型。如果要转成具体类型,就需要使用类型断言
直接将 x 的值 赋给 a 是不可以的,编译前检查都过不去
断言后可成功赋值,输出结果为 5
2、带检查的类型断言
类型断言有时候会失败,比如断言时传入的类型于 interface 指向的类型不一致,这样会导致程序 panic ,无法正常运行
我们需要检查断言是否成功以及结果是否有效
func main() {
var x interface{}
a := 1
x = 5
a ,ok := x.(int) // 类型断言后可直接赋值
// ok表示断言是否成功
// 即使断言成功,但是断言的结果也可能存在问题,也需要进行判断
if !ok || a == 0 {
fmt.Println("error")
}
fmt.Println(a)
}
这种断言是标准的格式
3、类型断言结合 switch
结合起来可以判断具体参数的类型
func test(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case bool:
fmt.Println("bool")
case int, int64:
fmt.Println("int")
case string:
fmt.Println("string")
case float64, float32:
fmt.Println("float")
default:
fmt.Println("unknown type")
}
}
}