问题:
gob 编码的输出是确定性的,意味着对于同等的 Go对象,编码结果将始终匹配?
答案:
在某些情况下,gob 编码是确定性的。这意味着对于两个 Go 对象 x 和 y,如果 x 等于 y,则 gob.Encode(x) 和 gob.Encode(y) 的输出将相同,只要:
地图的非确定性:
但是,当编码对象中涉及地图时,gob 编码变得不确定。这是因为映射的迭代顺序是随机的,导致它们的序列化顺序发生变化。因此,即使映射被认为是相等的,映射的编码结果也可能不同。
自描述流:
Gob 编码流是自描述的,这意味着它们包含每个数据项的类型信息。这意味着对于每个唯一类型,类型描述仅传输一次。因此,相同类型的后续编码将仅引用先前的类型规范。
这种自描述性质可能会导致多个编码实例中相同值的编码输出发生变化。第一个编码将包含类型规范和值,而后续编码将仅包含值和对先前类型规范的引用。
结论:
尽管当前的 gob 编码实现对于简单的结构和数组来说是确定性的,但必须注意的是,这种行为可能会随着未来的 Go 版本而改变。因此,依赖 gob 编码结果的精确匹配是不可取的。
以上是Go 的 gob 编码是确定性的吗?在什么条件下?的详细内容。更多信息请关注PHP中文网其他相关文章!