0

所以我有这个通过调用方法来初始化的varresolve类型。map[string][]byte如果我只是迭代resolve该值正在正确打印。

for k, v := range resolve {
        fmt.Printf("%s\t%s\n", k, v)
}

但是在下一行中,我试图迭代地图以将值存储在 db ( bolt) 中,因为地图中键 ( key1) 的值正在自动更改,我无法弄清楚原因。为了进一步简化我所做的是将该键的值存储在一个新的变量中

a:= resolve["key1"]

然后在将值存储在数据库中时,我检查了密钥是否为key1store a。在这种情况下a,不应该更改的值也正在更改。

这个要点有代码,我们可以看到resolve第 30 行的代码在第 34 行发生了变化。

我在 go playground 中添加了代码,这里是链接 https://play.golang.org/p/2WacK-xxRp_m

4

2 回答 2

3

在您的线路上readAll

lGraceP[string(k)] = v

您正在存储该值以供以后使用。文档指定v交易结束后该值无效。

来自螺栓库中的Cursor.First(并且在 中有类似的文本)(请参阅突出显示的文本):Cursor.Next

首先将光标移动到存储桶中的第一项并返回其键和值。如果存储桶为空,则返回 nil 键和值。返回的键和值仅在事务的生命周期内有效。

键和值仅在事务生命周期内有效的方式是重用其切片底层的数组。这会导致您的价值观发生意外变化。

于 2020-07-15T10:11:59.490 回答
2

问题一定出在 BoltDB 的某个地方,以及它如何处理为同一个键写入更大的值。如果我们不增加尺寸

dbData["1"] = []byte("vivek-9"))

然后它可以工作(如,其他值不受影响)。尝试快速浏览一下boltdb/bolt,但到目前为止什么都没有。

如果我猜的话,您从 ReadAll 获得的字节片是一个大后备字节数组的“窗口”。当您插入更大的值时,它会导致后续字节移位。但是窗户不会移动,因此他们现在正在观察不同的数据。在 ReadAll 中克隆您的值,这将有所帮助。

于 2020-07-15T09:57:20.287 回答