类型断言
单值断言 v.(T) 是什么? 断言失败会怎样?
- 单值断言:
v必须是接口值;目标为具体类型时要求动态类型相同,目标为接口时要求动态类型实现该接口,失败则 panic;
func main() {
var v any = "go"
s := v.(string) // 断言动态类型为 string;失败时 panic
println(s) // go
}
comma ok 断言如何写? 失败时返回什么?
- 安全断言:
value, ok := v.(T)用 bool 表达失败,失败时 value 为 T 的零值;无法保证类型时优先使用此形式;
func main() {
var v any = "go"
s, ok := v.(string) // 失败时返回 string 零值和 false
println(s, ok) // go true
}
type switch 的写法是什么? v.(type) 用在哪里?
- 类型分支:
v.(type)只用于 type switch;单个具体类型 case 中的变量具有该类型,case nil可单独处理 nil 接口;
package main
import "fmt"
func describe(v any) {
switch x := v.(type) { // v.(type) 只能用于 type switch
case int:
fmt.Println("int", x) // x 为 int
case string:
fmt.Println("string", x) // x 为 string
default:
fmt.Println("other")
}
}
func main() {
describe(42)
describe("go")
describe(true)
}
面对不同的类型确定性,应选哪种断言形式?
- 选择入口: 已确认类型且失败属于编程错误时使用单值断言;需要处理未知类型时使用 comma ok;需要分别处理多个类型时使用 type switch;各自细节见上文;