我已经阅读了一些关于 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
- 1 回答
- 0 关注
- 198 浏览
添加回答
举报
0/150
提交
取消