登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-29 09:07:26 150浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《将 nil 接口转换为 Golang 中的指针?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下golang,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

在以下代码段中,尝试将 nil 接口转换为某事物的指针失败,并出现以下错误:interface conversion: interface is nil, not *main.Node

type Nexter interface {
    Next() Nexter
}

type Node struct {
    next Nexter
}

func (n *Node) Next() Nexter {...}

func main() {
    var p Nexter

    var n *Node
    fmt.Println(n == nil) // will print true
    n = p.(*Node) // will fail
}

在此处播放链接:https: //play.golang.org/p/2cgyfUStCI

为什么这会失败?完全可以做到

n = (*Node)(nil)

,所以我想知道如何从 nil 接口开始实现类似的效果。

正确答案

这是因为 静态 类型的变量Nexter(它只是一个接口)可能包含许多不同 动态 类型的值。

是的,因为*Nodeimplements Nexter,你的p变量 可能 持有 type 的值*Node,但它也可能持有 其他类型 , which implement Nexter; 或者它可能什么也 没有nil价值)。并且类型断言不能在这里使用,因为引用规范:

x.(T)断言x不是 **,nil**并且存储的值x是 type 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
}

或者更好:使用特殊的“comma-ok”形式:

// This will never fail:
if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)
}

使用“comma-ok”形式:

的值oktrue断言是否成立。否则,它false的值n是 type 的零值T在这种情况下不会发生运行时恐慌。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>