gpt4 book ai didi

linked-list - 指针接收器不一致的 nil(Go bug?)

转载 作者:IT王子 更新时间:2023-10-29 01:26:14 24 4
gpt4 key购买 nike

当我偶然发现这个明显的不一致时,我正在做一个简单的链表接口(interface)来学习 Go 接口(interface)。 nextT 总是 nil 但 next() 的返回值不是。

package main

import (
"fmt"
)

type LinkedList interface {
next() LinkedList
}

type T struct {
nextT *T
}

func (t *T) next() LinkedList {
//uncomment to see the difference
/*if t.nextT == nil {
return nil
}*/
return t.nextT//this is nil!
}

func main() {
t := new(T)
fmt.Println(t.nextT == nil)

var ll LinkedList
ll = t
fmt.Println(ll.next() == nil)//why isn't this nil?
}

next() 中没有 nil 检查(我不应该这样做),我得到了

true
false

有了它我得到了预期的结果

true
true

我是发现了错误还是出于某种原因故意让我感到意外?使用 zip 安装(无 MSI)在带有 Go 版本 1 的 Windows 上运行

最佳答案

不,这不是错误。 Go 中的接口(interface)基本上是一对两个值:一个类型信息和一个指向实际数据的指针。将无类型值 nil 分配给接口(interface),这也恰好是接口(interface)的零值,意味着该接口(interface)既没有类型信息也没有指向任何存储数据的指针。

另一方面,将一个*T指针赋给一个接口(interface),会相应地设置类型信息,并让数据指针指向这个指针。在这种情况下,接口(interface)不再是 nil,因为您已经在其中存储了具有特定值的特定类型。在您的情况下,您存储的值恰好为零。您可以使用类型断言(或 reflect 包)来检查接口(interface)是否分配了特定类型。类型断言只有在类型信息匹配时才会成功(如果您之前已将 nil 分配给该接口(interface),则显然不会出现这种情况)。如果测试成功,您将得到一个 *T 返回,但此指针可能仍具有值 nil(这是该类型的有效值)。

看看 container/list Go 标准库中的 package 以查看更惯用的通用链表实现。还有一个 excellent article由 Russ Cox 撰写,其中包含对 Go 接口(interface)类型的深入解释。

关于linked-list - 指针接收器不一致的 nil(Go bug?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023593/

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