go - 无法更新结构中的 map slice

标签 go

我正在尝试更新结构中的 map slice 。它失败: slice 保持不变。请查看游乐场:https://play.golang.org/p/FIcLgyj2FE-
任何帮助深表感谢

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,而不是添加到结果映射中的Zoo实例。当您将sfZoo添加到result映射时,您添加了Zoo实例的副本。将新元素添加到sfZoo时,是将它们添加到sfZoo.Animals而不是result["San Francisco Zoo"].Animals中。

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

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


    result["San Francisco Zoo"] = &sfZoo

关于go - 无法更新结构中的 map slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942901/

相关文章:

go - 如何在go SDK中使用Couchbase N1QL查询扩展

go - 如何设置 Ginkgo 测试套件?

sql - 如何遍历结构的字段以进行查询过滤

types - 将一种类型的 slice 转换为等效类型的 slice 的优雅方法?

go - 不知道如何使用 GORM 的 DBResolver

utf-8 - 在 Go 中使用 C 库时,如何正确地将 UTF-8 编码的字符数组转换为 Go 字符串?

concurrency - 比较 2 张 map 的元素 - 我这样做对吗?

go - Golang中的Elasticsearch使用Olivere/Elastic包未返回任何结果

go - go 中的对象被替换

go - 如何使用方法编写延迟 block 会返回错误