猿问

Nil slice vs 空 slice 和 nil 值比较

我已经阅读了一些关于 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 在答案中的评论!


猛跑小猪
浏览 199回答 1
1回答

喵喵时光机

首先,您不需要指向接口的指针。一个接口已经是一个指针。请参阅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 anythingvar someNilSlice []intfmt.Println(someNilSlice == nil) // true, just some nil slicea = someNilSlicefmt.Println(a == nil) // false, now the interface does point to something
随时随地看视频慕课网APP

相关分类

Go
我要回答