英文:
Golang gob serializes array wrongly
问题
这两个数组之间有什么区别?为什么 gob 将空数组序列化成 []int(nil)
的形式?
这两个数组实际上是相同的,只是表示方式不同。[]int{}
表示一个空的整型数组,而 []int(nil)
表示一个空的整型切片,它的底层数组为 nil
。
在 gob 序列化过程中,空数组会被序列化为 []int(nil)
的形式,这是因为在序列化时,gob 会将切片的长度和底层数组一起进行编码。对于空切片来说,底层数组为 nil
,因此在反序列化时,会得到 []int(nil)
的形式。
这种表示方式的选择可能是为了在反序列化时能够正确地还原空数组的状态。
英文:
I pass to gob array like this
[]int{}
but on the receiving end I get array like this
[]int(nil)
What is the differences between these arrays? Why gob serializes empty array like this?
答案1
得分: 4
为什么gob会这样序列化空数组?
在文档中有解释:https://pkg.go.dev/encoding/gob
当解码一个切片时,如果现有的切片有足够的容量,切片将会就地扩展;如果没有足够的容量,将会分配一个新的数组。
从encoding/gob的角度来看,[]int{}和[]int(nil)是没有区别的。
更多信息:https://github.com/golang/go/issues/10905
没有通用的解决方法,你的代码必须以一种特定的方式处理这个问题,这取决于你想要实现的目标。如果你的目标是进行深拷贝,有一些方法可以避免完全使用gob。
而且似乎最好使用不同的解决方案。
讨论这个问题的更好地方可能是golang-nuts论坛:https://groups.google.com/forum/#!forum/golang-nuts
英文:
> Why gob serializes empty array like this?
It's here in the docs: https://pkg.go.dev/encoding/gob
> When a slice is decoded, if the existing slice has capacity the slice will be extended in place; if not, a new array is allocated.
From encoding/gob's point of view, []int{} and []int(nil) are
not differentiable.
More info: https://github.com/golang/go/issues/10905
> There is no general workaround, your code just has to deal with this in a specific way that depends on what you are trying to accomplish.
If your goal is to make a deep copy, there are approaches that avoid gob entirely.
And it seems it's better to use a different solution
> golang-nuts is probably a better place to discuss this.
https://groups.google.com/forum/#!forum/golang-nuts
答案2
得分: 0
[]int{}
- 空切片
[]int(nil)
- 空切片
Go Playground 示例:https://go.dev/play/p/RQGa76vNI5G
关于此 gob 行为的更多信息,请参阅此问题:https://github.com/golang/go/issues/10905
英文:
[]int{}
- empty slice
[]int(nil)
- nil slice
Go Playground with example: https://go.dev/play/p/RQGa76vNI5G
More info about this gob behaviour you can find in this issue: https://github.com/golang/go/issues/10905
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论