如何通过反射将映射值附加到切片?

假设

  1. 我使用的是 go1.17 而不是 1.18,所以 go 1.18 中的答案可能对其他人有帮助,但对我没有帮助。

  2. 我搜索并尝试了很多东西,但这种情况从未解决。

问题

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]

可能吗?

是否有任何其他替代方法可以从我的代码中的其他地方更改这些数据?

谢谢你的帮助。


慕桂英4014372
浏览 73回答 1
1回答

梦里花落0921

如果只传递切片[1, 2, 3],无论做什么,您都永远不会看到打印出来的内容。appendData()2 件事:您不能更改存储在地图中的值。如果必须更改值,则必须重新分配新值。有关详细信息,请参阅如何在 Go 中更新地图值第二:您也不能更改存储在接口中的值。有关详细信息,请参阅从声明类型的接口切片中删除元素正确的做法:如果你想改变一些东西,总是传递一个指向它的指针,并修改指向的值。当然,在您的情况下,您不能传递指向存储在地图中的值的指针(“指向地图”),所以这是不可能的。地图索引表达式是不可寻址的,详见Cannot take the address of map element。如果必须使用地图,则必须在地图中存储一个指针,并且可以传递该指针。另一种方法是返回新的、修改后的切片并在调用者处分配新的切片,确切地说是内置的/如何做的append()(append()返回一个你应该分配/存储的新切片)。如果沿着这条路线走下去,您可以在地图中存储非指针切片,因为您可以将修改后的切片重新分配给相同的地图键。
打开App,查看更多内容
随时随地看视频慕课网APP