跳到主要内容

类型断言

单值断言 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;各自细节见上文;