Go 无法更新结构中的映射切片

Go 无法更新结构中的映射切片,go,Go,我正在尝试更新结构中的地图切片。失败:切片保持不变。请看操场: 非常感谢您的帮助 package main import ( "encoding/json" "fmt" ) type Zoo struct { Animals []map[string]string } func (zoo *Zoo) addAnimalData(el map[string]string) { zoo.Animals = append(zoo.Animals, el) }

我正在尝试更新结构中的地图切片。失败:切片保持不变。请看操场: 非常感谢您的帮助

package main

import (
    "encoding/json"
    "fmt"
)

type Zoo struct {
    Animals []map[string]string
}

func (zoo *Zoo) addAnimalData(el map[string]string) {
    zoo.Animals = append(zoo.Animals, el)
}


func main() {
    result := make(map[string]Zoo)
    sfZoo := Zoo{
        Animals: make([]map[string]string, 0),
    }
    result["San Francisco Zoo"] = sfZoo
    animals := make(map[string]string)
    animals["elephant"] = "Vegetarian"
    animals["bear"] = "Omnivore"
    sfZoo.addAnimalData(animals)

    jsonified, _ := json.MarshalIndent(result, "", "  ")
    fmt.Println(string(jsonified))
}

因为
sfZoo
是值,所以它在被
addAnimalData
修改之前会被复制到
result
。如果您先调用
addAnimalData
,然后设置
result
,您将获得预期的输出

package main

import (
    "encoding/json"
    "fmt"
)

type Zoo struct {
    Animals []map[string]string
}

func (zoo *Zoo) addAnimalData(el map[string]string) {
    zoo.Animals = append(zoo.Animals, el)
}


func main() {
    result := make(map[string]Zoo)
    sfZoo := Zoo{
        Animals: make([]map[string]string, 0),
    }

    animals := make(map[string]string)
    animals["elephant"] = "Vegetarian"
    animals["bear"] = "Omnivore"
    sfZoo.addAnimalData(animals)
    result["San Francisco Zoo"] = sfZoo
    jsonified, _ := json.MarshalIndent(result, "", "  ")
    fmt.Println(string(jsonified))
}
显示


问题是您正在将映射添加到结果映射中的
sfZoo
,而不是
Zoo
实例。将
sfZoo
添加到
result
映射中时,添加了
Zoo
实例的副本。将新元素添加到
sfZoo
时,是将它们添加到
sfZoo.Animals
,而不是添加到
result[“旧金山动物园”].Animals

解决此问题的最简单方法是将结果声明为:

    result := make(map[string]*Zoo)


换成这样,我希望能解决你的问题

result:=make(映射[string]*Zoo)

result[“旧金山动物园”]=&sfZoo

试试看:


您正在修改
sfZoo
,然后输出
结果
,因此您当然看不到任何变化。这是有效的。我认为复制也可以,因为贴图/切片是他们过去称之为“引用类型”的东西,并且在引擎盖下有一个指针。无论如何,这是可行的,但在实际的应用程序中,感恩顺序不是一个选项。该应用程序需要通过键访问,并在输入地图后改变结构。无论如何,“顺序”不是答案中最重要的关键字。绝望的
    result := make(map[string]*Zoo)
    result["San Francisco Zoo"] = &sfZoo