为了账号安全,请及时绑定邮箱和手机立即绑定

Nil slice vs 空 slice 和 nil 值比较

Nil slice vs 空 slice 和 nil 值比较

Go
猛跑小猪 2021-11-29 16:28:48
我已经阅读了一些关于 nil slice 与 empty slice 的文本。我相信我对它们之间的差异有一些基本的了解。我的理解总结:var instance []Typeis nil slice and instance == nilreturn true; whileinstance:=[]Type{}是空切片并且instance != nil然而,这个特殊的例子仍然让我感到困惑。请查看下面的链接以获取代码。我的问题是最后两个案例。 https://play.golang.org/p/udyHoOlSeP假设我想比较两个切片,重命名类型和接口匹配等等。接收者可以是的实例nil,即使它没有被定义为按值复制;虽然参数是按值复制的,但只要参数不是无类型的,它似乎是非零的。在最后两种情况下,接收器已被识别为nilwhile 参数正在处理,:=因此它变成了一个空切片。(但other == nil也报告错误......)我该如何解决这个问题以满足以下要求?nilslice.Equals(nilslice) // -> true此外,我尝试定义另一个与接口指针相比的接口,但失败了。编译器抱怨说cannot use p (type *AnotherNullable) as type *PointerComparable in argument to AnotherNullable(nil).Equals:    *PointerComparable is pointer to interface, not interface https://play.golang.org/p/wYO1GKcBds我该如何解决?编辑:感谢@zippoxer 提供的所有见解。我学到了很多。我也希望新读者,也请不要忘记查看@zippoxer 在答案中的评论!
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

首先,您不需要指向接口的指针。一个接口已经是一个指针。请参阅Go:interface{} 的含义是什么?


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


其次,接收者Nullable不是一个接口,而你传递给 Equals 的参数是一个接口。这将解释为什么Nullable接收器保持 nil 并且Comparable参数不是 nil,尽管它的底层切片是。问题是,Comparable参数是一个指向某物的接口,所以无论它指向什么,它都不会为零。


这段代码解释了这个问题:


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


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信