gpt4 book ai didi

pointers - 将 nil 接口(interface)转换为 Golang 中的指针?

转载 作者:IT老高 更新时间:2023-10-28 13:06:13 29 4
gpt4 key购买 nike

在下面的代码片段中,尝试将 nil 接口(interface)转换为指针失败并出现以下错误: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 接口(interface)开始实现类似的效果。

最佳答案

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

是的,由于 *Node 实现 Nexter,您的 p 变量 可能 保存 类型的值>*Node,但它也可能包含实现 Nexter其他类型;或者它可能根本不包含 nothing(nil 值)。和Type assertion不能在这里使用,因为引用规范:

x.(T) asserts that x is not nil and that the value stored in x is of type T.

但在您的情况下 xnil。如果类型断言为假,会发生运行时 panic

如果你改变你的程序来初始化你的 p 变量:

var p Nexter = (*Node)(nil)

您的程序将运行并且类型断言成功。这是因为接口(interface)值实际上包含一对形式为:(value, dynamic type),在这种情况下,您的 p 不会是 nil,但会持有一对 (nil, *Node);详情见The Laws of Reflection #The representation of an interface .

如果你还想处理接口(interface)类型的 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”形式:

The value of ok is true if the assertion holds. Otherwise it is false and the value of n is the zero value for type T. No run-time panic occurs in this case.

关于pointers - 将 nil 接口(interface)转换为 Golang 中的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30162256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com