You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言新手求助:如何创建包含多个结构体的Map

问题解决思路

首先你需要明确几个关键问题:

  1. JSON不允许重复键:你想要的多个"shope"键的结构是无效的,正确的做法是用数组(Go里的切片)存储多个店铺。
  2. Go结构体字段需导出:小写开头的字段无法被JSON序列化,必须改成首字母大写。
  3. 单个结构体无法存多个元素:原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:14:55