19_类型断言与类型选择
安全地取出接口中的具体值,选择合适的多类型处理方式。
Go 基础专题 19:类型断言与类型选择
学习目标:安全地取出接口中的具体值,选择合适的多类型处理方式。
核心知识
value.(T) 尝试从接口值取出具体类型 T。单返回值形式断言失败会 panic;通常使用 result, ok := value.(T),由 ok 判断。若需要处理多个类型,可以使用 switch value := input.(type),每个分支中的 value 具有对应类型。
package main
import "fmt"
func describe(input any) string {
switch value := input.(type) {
case int:
return fmt.Sprintf("整数 %d", value)
case string:
return "文本 " + value
default:
return "其他"
}
}
func main() { fmt.Println(describe(3)) }
类型断言检查的是动态类型是否满足目标类型,并不会把字符串 "3" 转成整数 3;转换文本仍需 strconv.Atoi。如果代码到处断言同几个具体类型,可能说明接口设计过宽;可考虑更窄接口或泛型。
接口可以断言成另一个接口,表示动态值实现了该接口的方法。reflect 能做更动态的检查,但普通业务逻辑优先使用静态类型与清晰分支。
逐步理解
类型断言的双返回值写法是安全边界:先判断 ok,再使用结果。类型选择适合处理几种确切类型;若分支持续增加,检查数据模型是否应该改成接口方法。断言不会发生数值或文本转换,any("12") 断言成 int 会失败,应先断言为字符串,再调用解析函数。
动手练习
练习:安全判断 var x any = "go" 是否为字符串。答案:text, ok := x.(string),ok 为真且 text == "go"。