附加到地图中结构中的切片

Appending to a slice in a struct in a map

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

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 而不是我可以追加到?

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

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

map[string]*MyInnerStruct

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

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

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