所以我有這個通過調用方法來初始化的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
2 回答

12345678_0001
TA貢獻1802條經驗 獲得超5個贊
在您的線路上readAll
:
lGraceP[string(k)] = v
您正在存儲該值以供以后使用。文檔指定v
交易結束后該值無效。
來自螺栓庫中的Cursor.First
(并且在 中有類似的文本)(請參閱突出顯示的文本):Cursor.Next
首先將光標移動到存儲桶中的第一項并返回其鍵和值。如果存儲桶為空,則返回 nil 鍵和值。返回的鍵和值僅在事務的生命周期內有效。
鍵和值僅在事務生命周期內有效的方式是重用其切片底層的數組。這會導致您的價值觀發生意外變化。

MMMHUHU
TA貢獻1834條經驗 獲得超8個贊
問題一定出在 BoltDB 的某個地方,以及它如何處理為同一個鍵寫入更大的值。如果我們不增加尺寸
dbData["1"] = []byte("vivek-9"))
然后它可以工作(如,其他值不受影響)。嘗試快速瀏覽一下boltdb/bolt,但到目前為止什么都沒有。
如果我猜的話,您從 ReadAll 獲得的字節片是一個大后備字節數組的“窗口”。當您插入更大的值時,它會導致后續字節移位。但是窗戶不會移動,因此他們現在正在觀察不同的數據。在 ReadAll 中克隆您的值,這將有所幫助。
- 2 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消