亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

地圖中鍵的值在golang中自動更改

地圖中鍵的值在golang中自動更改

Go
當年話下 2022-06-13 17:33:44
所以我有這個通過調用方法來初始化的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 鍵和值。返回的鍵和值僅在事務的生命周期內有效。

鍵和值僅在事務生命周期內有效的方式是重用其切片底層的數組。這會導致您的價值觀發生意外變化。


查看完整回答
反對 回復 2022-06-13
?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

問題一定出在 BoltDB 的某個地方,以及它如何處理為同一個鍵寫入更大的值。如果我們不增加尺寸

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

然后它可以工作(如,其他值不受影響)。嘗試快速瀏覽一下boltdb/bolt,但到目前為止什么都沒有。

如果我猜的話,您從 ReadAll 獲得的字節片是一個大后備字節數組的“窗口”。當您插入更大的值時,它會導致后續字節移位。但是窗戶不會移動,因此他們現在正在觀察不同的數據。在 ReadAll 中克隆您的值,這將有所幫助。


查看完整回答
反對 回復 2022-06-13
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號