因此,我有这种resolve
类型的var map[string][]byte
,可以通过调用方法进行初始化。如果我只是迭代resolve
,那么该值可以正确打印。
for k, v := range resolve {
fmt.Printf("%s\t%s\n", k, v)
}
但是在下一行中,我尝试遍历 map 以将值存储在db(bolt
)中,因为 map 中的键(key1
)的值正在自动更改,因此我无法弄清楚为什么。为了进一步简化我所做的工作,将该键的值存储在新的变量中
a:= resolve["key1"]
然后在将值存储在数据库中时,我检查了 key 是否为key1
和a
。在这种情况下,a
的值也将更改,但不应更改。此gist具有代码,我们将能够看到第30行中的
resolve
已在第34行中进行了更改。我已经在操场上添加了代码,这里是链接
https://play.golang.org/p/2WacK-xxRp_m
最佳答案
在您的readAll
行中:
lGraceP[string(k)] = v
您正在存储值供以后使用。文档指定事务结束后,值v
无效。在 bolt 库的
Cursor.First
中(并且Cursor.Next
中有类似的文本)(请参见突出显示的文本):First moves the cursor to the first item in the bucket and returns its key and value. If the bucket is empty then a nil key and value are returned. The returned key and value are only valid for the life of the transaction.
键和值仅在事务生命周期内有效的方式是,重新使用其片下的数组。这会导致您的值发生意外变化。
关于loops - 映射中键的值会在golang中自动更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62910590/