gpt4 book ai didi

go - Nil slice vs 空 slice 和 nil 值比较

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

我读过一些关于 nil slice 和 empty slice 的文章。我相信我对它们之间的区别有一些基本的了解。

我的理解总结:var instance []Type is nil slice and instance == nil returns true;而 instance:=[]Type{} 是空 slice 并且 instance != nil

然而,这个特殊的例子仍然让我感到困惑。

请查看下面的链接以获取代码。我的问题是最后两个案例。 https://play.golang.org/p/udyHoOlSeP

假设我想比较两个 slice ,重命名类型和接口(interface)匹配等等。接收者可以是 nil 的实例,即使它没有定义为按值复制;虽然参数是按值复制的,但似乎只要参数不是无类型的,就可以是非零。

在最后 2 种情况下,当参数被 := 处理时,接收方被识别为 nil,因此它变成了一个空 slice 。 (但是 other == nil 也报告 false...)我怎样才能解决这个问题以满足以下要求?

nilslice.Equals(nilslice)//-> true


此外,我尝试定义另一个与接口(interface)指针相比的接口(interface),但失败了。编译器提示说

不能在 AnotherNullable(nil) 的参数中使用 p(类型 *AnotherNullable)作为类型 *PointerComparable。等于:
*PointerComparable 是指向接口(interface)的指针,不是接口(interface)
https://play.golang.org/p/wYO1GKcBds

我该如何解决?

编辑:感谢@zippoxer 提供的所有见解。我学到了很多。我希望新读者也不要忘记在答案中查看@zippoxer 的评论!

最佳答案

首先,您不需要指向接口(interface)的指针。一个接口(interface)已经是一个指针。参见 Go: What's the meaning of interface{}?

只需更改 Equals 方法以接受 PointerComparable 而不是 *PointerComparable。 Equals 将接受一个接口(interface)而不是一个指向接口(interface)的指针,但你仍然可以将一个指针传递给一个 slice/任何给它的东西。参见 https://play.golang.org/p/e_Gtq2oAFA

其次,接收者 Nullable 不是一个接口(interface),而您传递给 Equals 的参数是一个接口(interface)。这可以解释为什么 Nullable 接收器保持为 nil 而 Comparable 参数不是 nil,尽管它的底层 slice 是。问题是,Comparable 参数是一个指向某物的接口(interface),因此无论它指向什么,都不会为 nil。

这段代码解释了问题:

var a interface{}
fmt.Println(a == nil) // true, the interface doesn't point to anything
var someNilSlice []int
fmt.Println(someNilSlice == nil) // true, just some nil slice
a = someNilSlice
fmt.Println(a == nil) // false, now the interface does point to something

关于go - Nil slice vs 空 slice 和 nil 值比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312010/

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