Go语言新手求助:如何创建包含多个结构体的Map
问题解决思路
首先你需要明确几个关键问题:
- JSON不允许重复键:你想要的多个
"shope"键的结构是无效的,正确的做法是用数组(Go里的切片)存储多个店铺。 - Go结构体字段需导出:小写开头的字段无法被JSON序列化,必须改成首字母大写。
- 单个结构体无法存多个元素:原
ResultMap里的shope是单个Shope类型,要改成切片[]Shope才能存储多个店铺。
修正后的结构体定义
type ResultMap struct { Title string `json:"title"` Shops []Shope `json:"shops"` // 改成复数避免命名混淆,用切片存储多个店铺 } type Shope struct { Title string `json:"title"` Prices PriceModel `json:"prices"` } type PriceModel struct { Price float64 `json:"price"` PriceSale float64 `json:"priceSale"` }
循环构建数据的正确代码
// 初始化顶层结果结构 result := ResultMap{ Title: "Foo", Shops: []Shope{}, // 初始化空切片 } // 遍历shoplist填充数据 for _, item := range shoplist { // 构建单个店铺实例 shop := Shope{ Title: item.shope, Prices: PriceModel{ Price: item.price, PriceSale: item.priceSale, }, } // 将店铺添加到切片中 result.Shops = append(result.Shops, shop) }
最终生成的JSON结构(正确格式)
{ "title": "Foo", "shops": [ { "title": "Matket_1", "prices": { "price": 100.5, "priceSale": 99.5 } }, { "title": "Matket_2", "prices": { "price": 100.5, "priceSale": 99.5 } } ] }
补充说明
- 如果需要把结果转成JSON字符串,记得导入
encoding/json包,用json.MarshalIndent格式化输出。 - 你之前循环里重复赋值
shope字段会直接编译报错,因为结构体初始化时每个字段只能赋值一次,改成切片后就不存在这个问题了。
内容的提问来源于stack exchange,提问作者nikar
相关产品推荐
相关产品推荐

