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

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

如何通過反射將映射值附加到切片?

如何通過反射將映射值附加到切片?

Go
慕桂英4014372 2022-12-19 14:10:25
假設我使用的是 go1.17 而不是 1.18,所以 go 1.18 中的答案可能對其他人有幫助,但對我沒有幫助。我搜索并嘗試了很多東西,但這種情況從未解決。問題import (    "fmt"    "reflect")func main() {    l := map[string][]interface{}{"a": {}}    appendData(l["a"])    fmt.Println(l["a"])}func appendData(k interface{}) {    lValue := reflect.ValueOf(k)    lValue.Set(reflect.Append(lValue, reflect.ValueOf(1)))    lValue.Set(reflect.Append(lValue, reflect.ValueOf(2)))    lValue.Set(reflect.Append(lValue, reflect.ValueOf(3)))}我將場景簡化為這段代碼。我只需要能夠更改[]interface{}從appendData函數傳遞的 interfaces() 切片的元素。請不要將這行代碼發送給我l["a"] = appendData(l["a"]).([]interface{})。我知道這行得通,但由于某種原因我無法在我的代碼中實現它。(我正在做一些 BFS 的東西但我不能這樣做,我當時必須更改一些值)我想要的是?我只想看到這個輸出:[1, 2, 3]可能嗎?是否有任何其他替代方法可以從我的代碼中的其他地方更改這些數據?謝謝你的幫助。
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

如果只傳遞切片[1, 2, 3],無論做什么,您都永遠不會看到打印出來的內容。appendData()

2 件事:您不能更改存儲在地圖中的值。如果必須更改值,則必須重新分配新值。有關詳細信息,請參閱如何在 Go 中更新地圖值

第二:您也不能更改存儲在接口中的值。有關詳細信息,請參閱從聲明類型的接口切片中刪除元素

正確的做法:如果你想改變一些東西,總是傳遞一個指向它的指針,并修改指向的值。當然,在您的情況下,您不能傳遞指向存儲在地圖中的值的指針(“指向地圖”),所以這是不可能的。地圖索引表達式是不可尋址的,詳見Cannot take the address of map element。如果必須使用地圖,則必須在地圖中存儲一個指針,并且可以傳遞該指針。

另一種方法是返回新的、修改后的切片并在調用者處分配新的切片,確切地說是內置的/如何做的append()append()返回一個你應該分配/存儲的新切片)。如果沿著這條路線走下去,您可以在地圖中存儲非指針切片,因為您可以將修改后的切片重新分配給相同的地圖鍵。


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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