loops - 映射中键的值会在golang中自动更改

标签 loops go boltdb

因此,我有这种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 是否为key1a。在这种情况下,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/

相关文章:

angularjs - 在 Angular/Golang 项目中使用 JWT

database - golang 和 boltdb : using closures to wrap a bucket ForEach function

go - 如何为Google存储空间创建文件大小受限的签名URL?

sockets - 转到套接字 : too many open files

javascript - 循环中的数字测试

php - 将多条记录输入mysql数据库

go - 我可以在 boltdb 的嵌套存储桶下嵌套存储桶吗?

go - Cayley 与 BoltDB 后端?

java - for 循环中缺少 return 语句

php - 数据库中的第一行未通过 mysql_fetch_row 或 mysql_fetch_assoc 显示在表中