类型断言与 type-switch
从 C++ 的 dynamic_cast / typeid 到 Go 的类型断言、类型开关与反射初探 一、简述 接口变量在运行时存储了"动态类型"。当我们需要把接口值还原成具体类型、或按不同类型走不同逻辑时,就用类型断言(type assertion)和类型开关(type switch)。 核心要点:Go 类型断言是 x.(T) 语法——它是"安全的 dynamic_cast":带 ok 判断时永远不会 panic。类型开关 switch v := x.(type) 则是处理"未知类型集合"最优雅的方式。 二、C++ 对照速查表 概念 C++ Go 关键差异 向下转型 dynamic_cast<T*>(ptr) v, ok := x.(T) Go 更简洁,双返回值 不安全转型 static_cast / reinterpret_cast v := x.(T) Go 会 panic(不推荐) 类型判断 typeid(x) == typeid(T) x.(type)(type switch) 语法不同 类型名称 typeid(x).name() fmt.Sprintf("%T", x) 运行时类型名 反射 RTTI / <typeinfo> reflect 包 用法差异大 三、类型断言基础 3.1 语法与两种形式 var x any = 42 // 形式一:带 ok(推荐,安全) v, ok := x.(int) if ok { fmt.Println("是 int:", v) // 42 } else { fmt.Println("不是 int") } // 形式二:不带 ok(不推荐,失败直接 panic) v2 := x.(int) // ✅ 成功 // v3 := x.(string) // ❌ panic: interface conversion 规则:永远用带 ok 的形式。不带 ok 的写法相当于 C++ 的 static_cast——假设你知道类型,错了就崩。 ...
豫公网安备41108202000982号