登录
首页 >  Golang >  Go问答

利用反射,如何将切片附加为地图的值?

来源:stackoverflow

时间:2024-02-07 19:27:24 350浏览 收藏

从现在开始,努力学习吧!本文《利用反射,如何将切片附加为地图的值?》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

假设

  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)))
}

我将场景简化为这段代码。

我只需要能够从 appenddata 函数更改传递的接口片段([]interface{})的元素。

不要向我发送这行代码 l["a"] =appenddata(l["a"]).([]interface{})

我知道这是可行的,但由于某种原因我无法在我的代码中实现它。(我正在做一些 bfs 的东西,但我不能这样做,我当时必须更改一些值)

我想要什么?

我只是想看看这个输出:

[1, 2, 3]

可以吗?

是否有其他替代方法可以从代码中的其他位置更改这些数据?

感谢您的帮助。


正确答案


如果只传递切片,无论 appendData() 做什么,您都永远不会看到 [1, 2, 3] 被打印。

有两件事:您无法更改存储在地图中的值。如果必须更改该值,则必须重新分配新值。详情见How to update map values in Go

第二:您也无法更改存储在接口中的值。详情见Removing an element from a type asserted Slice of interfaces

正确的方法:如果你想改变某些东西,总是传递一个指针给它,并修改指向的值。当然,在您的情况下,您无法传递指向存储在映射中的值(“指向映射”)的指针,因此这是不可能的。映射索引表达式不可寻址,详细信息请参见Cannot take the address of map element。如果必须使用映射,则必须在映射中存储一个指针,并且可以传递该指针。

另一种方法是返回新的、修改后的切片并在调用者处分配新切片,这正是内置 append() 的作用/方式(append() 返回您希望分配/存储的新切片) 。如果您沿着这条路线走下去,您可以在地图中存储非指针切片,因为您可以将修改后的切片重新分配给相同的地图键。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《利用反射,如何将切片附加为地图的值?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>