我已经阅读了一些关于零切片与空切片的文本。我相信我对它们之间的差异有一些基本的了解。
我的理解摘要: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的评论!答案 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