假設
- 我使用的是 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{}
)片段的元素。
請不要把這行代碼發給我。
我知道這可行,但由于某種原因我無法在我的代碼中實作它。(我正在做一些 BFS 的東西,我不能這樣做,我當時必須更改一些值)appendData
l["a"] = appendData(l["a"]).([]interface{})
我想要的是?
我只想看看這個輸出:
[1, 2, 3]
可能嗎?
是否有其他替代方法可以從代碼中的其他位置更改這些資料?
謝謝你的幫助。
uj5u.com熱心網友回復:
你永遠不會看到列印出來的東西,如果只通過切片[1, 2, 3]
,不管做什么。appendData()
兩件事:您不能更改存盤在地圖中的值。如果必須更改值,則必須重新分配新值。有關詳細資訊,請參閱如何在 Go 中更新地圖值
第二:您也不能更改存盤在介面中的值。有關詳細資訊,請參閱從型別斷言的介面切片中洗掉元素
正確的做法:如果你想改變一些東西,總是傳遞一個指向它的指標,并修改指向的值。當然,在您的情況下,您不能傳遞指向存盤在地圖中的值的指標(即“指向地圖”),所以這是不可能的。地圖索引運算式是不可尋址的,詳見不能取地圖元素的地址。如果必須使用地圖,則必須在地圖中存盤一個指標,并且可以傳遞該指標。
另一種方法是回傳新的、修改后的切片并在呼叫者處分配新切片,內置函式究竟是什么/如何append()
執行它(append()
回傳一個您應該分配/存盤的新切片)。如果你沿著這條路線走,你可以在映射中存盤非指標切片,因為你可以將修改后的切片重新分配給相同的映射鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485174.html