首页 > 解决方案 > 附加到地图结构中的切片

问题描述

我正在尝试附加到地图中的切片:

type MyOuterStruct struct{
    name string
    inners map[string]MyInnerStruct
}

type MyInnerStruct struct{
    name string
    list []int
}

func main() {
    
    ms := MyOuterStruct{
        name: "outer",
        inners: map[string]MyInnerStruct{
            "a": {name: "inner"},
        },
    }
    
    ms.inners["a"].list = append(ms.inners["a"].list, 4, 5, 6)
    
    fmt.Println(ms.inners["a"].list)

    //cannot assign to struct field ms.inners["a"].list in map
}

我知道问题是我正在分配一个“无法寻址”的字段,但我不确定如何正确地构造它。

我试过以下

myCurrentList := ms.inners["a"].list
myCurrentList = append(myCurrentList, 4, 5, 6)
ms.inners["a"].list = myCurrentList

但这也不正确。

我应该如何构建,MyInnerStruct以便我可以访问list比我可以附加的动态切片?

标签: goslice

解决方案


问题是ms.inners["a"]返回为该键存储的值的副本。因此,当您修改该副本的成员时,它不会反映在存储在地图中的副本上。

最简单的解决方案是将地图定义为:

map[string]*MyInnerStruct

这样,ms.inners["a"]返回一个指向存储在映射中的值的指针。另一种解决方案是:

x:=ms.inners["a"]
x.list = myCurrentList
ms.inners["a"]=x

这会将存储在映射中的结构复制到x,对其进行修改,然后将其复制回来。


推荐阅读