将nil接口转换为Golang中某物的指针?

将nil接口转换为Golang中某物的指针?,第1张

将nil接口转换为Golang中某物的指针?

这是因为 静态 类型的变量

Nexter
(只是一个接口)可能包含许多不同 动态 类型的值。

是的,因为

*Node
工具
Nexter
,您的
p
变量 可能 持有类型的值
*Node
,但它可以容纳 其他类型 以及其实施
Nexter
;
或者它可能持有 什么
都(
nil
值)。而且类型断言不能在这里使用,因为引用了规范:

x.(T)
断言
x
nil
和存储在值
x
是类型的
T

但是

x
你的情况是
nil
。如果类型断言为假, 则会发生运行时恐慌

如果您更改程序以使用以下方法初始化

p
变量:

var p Nexter = (*Node)(nil)

您的程序将运行,并且类型声明成功。这是因为接口值实际上以以下形式持有一对:

(value, dynamictype)
,在这种情况下,您
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=%#vn", n)}

使用“逗号分隔”形式:

如果断言成立,

ok
则值为
true
。否则,它是
false
和值
n
是类型的零值
T
在这种情况下,不会发生运行时恐慌。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5125834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存