直接回答x.(T) 把接口值还原为具体类型 T。两种形式:v := x.(T) 断言失败直接 panic;v, ok := x.(T)(comma ok)失败时 ok 为 false、v 是 T 的零值,不 panic。除非断言在逻辑上必然成立,否则一律用 comma ok。按类型分派逻辑用 type switch 更清晰:

switch v := i.(type) {
case int:    // v 自动绑定为 int
case string: // v 为 string
case nil:    // 接口本身为 nil
default:     // v 保持原接口类型
}

展开解析:两个细节要记牢。其一,断言针对接口的动态类型:装着 *MyErr 的 error 接口断言成 MyErr(值类型)会失败,两者是不同类型。其二,nil 接口与「装着 nil 指针的接口」是两回事,comma ok 无法帮你区分后者。性能上断言本质是比较 itab 里的类型指针,开销极小;真正的成本是滥用 any 丢掉编译期检查——能用泛型或小接口表达的设计,就不要用 any 加断言。

追问方向:itab 结构如何支撑类型断言?nil *T 装进接口后为什么 != nil?(约 575 字)