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