零片与空片和零值比较

时间:2015-12-16 12:25:13

标签: go

我已经阅读了一些关于零切片与空切片的文本。我相信我对它们之间的差异有一些基本的了解。

我的理解摘要:var instance []Type为零切片,instance == nil返回true;虽然instance:=[]Type{}是空切片而instance != nil

然而,这个特殊的例子仍然困扰着我。

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

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

在最后两种情况下,当nil正在处理参数时,接收器已被识别为:=,因此它变为空切片。 (但是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 个答案:

答案 0 :(得分:4)

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

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

其次,接收者Nullable不是接口,而传递给Equals的参数是接口。这可以解释为什么Nullable接收器保持为零并且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