类型断言基本介绍
类型断言(Type Assertion) 是一种用来检查接口变量具体类型的方法。
从接口值中提取出底层的具体类型值,或者验证接口值是否持有特定的具体类型。
类型断言基本语法
value, ok := interfaceValue.(TargetType)
interfaceValue
:表示要进行类型断言的接口值。TargetType
:希望断言的目标类型。- 如果断言成功,
value
将包含转换后的值,ok
为true
。- 如果断言失败,
value
的值是该类型的零值,ok
为false
。
类型断言示例
package main
import "fmt"
func main() {
var i interface{} = "hello"
// 简单类型断言
s := i.(string)
fmt.Println(s) // 输出: hello
// 安全类型断言
value, ok := i.(string)
if ok {
fmt.Println(value) // 输出: hello
} else {
fmt.Println("类型断言失败")
}
// 错误的类型断言会引发 panic
// f := i.(float64) // 这里会导致运行时错误
}
类型断言可以有一个接收参数也可以有两个,具体看上述例子。
类型断言返回的值是转换回来的类型,上述例子中就是string类型。
简单类型断言转换失败报错panic。
类型断言使用场景
1. 场景需求:若干个自定义类型实现了一个接口。这写自定义类型可以在一个函数中统一操作,现在要求,如果是自定义类型A,添加一些额外操作...
该场景使用类型断言解决,结合if语句判断就可以。
func Working(i Interface{}){ //接收某个接口类型参数
value, ok := i.(struct_type) //断言成功的话,value已经是struct_type类型了
if ok {
操作体
}
......
}
2. 场景需求:判断传入的实参到底是什么类型,不同的类型进行不同的操作。
package main
import (
"fmt"
)
// TypeJudge 接收任意数量和类型的参数,并尝试判断它们的具体类型
func TypeJudge(items ...interface{}) {
for i, item := range items {
switch v := item.(type) { //简单类型断言
case int, int64:
fmt.Printf("第 %d 个参数是 int 类型,值为: %d\n", i+1, v)
case string:
fmt.Printf("第 %d 个参数是 string 类型,值为: %s\n", i+1, v)
case float64:
fmt.Printf("第 %d 个参数是 float64 类型,值为: %f\n", i+1, v)
default:
fmt.Printf("第 %d 个参数是 unknown 类型,值为: %v\n", i+1, v)
}
}
}
func main() {
TypeJudge(10, "hello", 3.14, true)
}
在这里复习一个知识点,可变参数。
func TypeJudge(k int, i ...float64)
这是一个函数,它有两个参数:
k int:一个普通的整型参数。
i ...float64:一个可变参数(variadic parameter),表示可以传入 0 个或多个 float64 类型的值。
i 的类型是一个 float64 的切片。
方式1:
TypeJudge(10, 1.1, 2.2, 3.3)
方式2:直接传一个切片类型
values := []float64{1.1, 2.2, 3.3}
TypeJudge(10, values...)