1 回答
TA贡献1862条经验 获得超6个赞
这是因为静态类型的变量Nexter(它只是一个接口)可能包含许多不同动态类型的值。
是的,由于*Nodeimplements Nexter,您的p变量可能包含 type 的值*Node,但它也可能包含其他类型的implementation Nexter;或者它可能什么都没有(nil价值)。和类型断言这里不能使用,因为从规格报价:
x.(T)断言x是不nil和存储在值x是类型的T。
但x在你的情况下是nil. 如果类型断言为假,则会发生运行时恐慌。
如果你改变你的程序来初始化你的p变量:
var p Nexter = (*Node)(nil)
您的程序将运行并且类型断言成功。这是因为接口值实际上以 : 的形式保存一对(value, dynamic type),在这种情况下,您p不会是nil,但会保存一对(nil, *Node); 有关详细信息,请参阅反射定律 #接口的表示。
如果你还想处理nil接口类型的值,你可以像这样明确地检查它:
if p != nil {
n = p.(*Node) // will not fail IF p really contains a value of type *Node
}
或者更好:使用特殊的“逗号确定”形式:
// This will never fail:
if n, ok := p.(*Node); ok {
fmt.Printf("n=%#v\n", n)
}
使用“逗号确定”形式:
如果断言成立,ok则值为is true。否则,它false的值n是 type 的零值T。在这种情况下不会发生运行时恐慌。
- 1 回答
- 0 关注
- 204 浏览
添加回答
举报