Golang gob序列化数组错误。

huangapple go评论90阅读模式
英文:

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

huangapple
  • 本文由 发表于 2021年12月15日 05:51:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/70355969.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定