繁体   English   中英

如何在 Golang 的结构中迭代切片,或者是否可以在结构中使用 for 循环?

[英]How to iterate a slice within struct in Golang or is it possible to use for loop within struct?

我有两个结构。 一种用于彩票,一种用于奖励。 我正在使用 Mysql 数据库。 我想从数据库中读取数据并以 JSON 格式写入。 我可以做到这一点,但我想要一个嵌套结构,我想在 Lottery 结构中迭代 Reward 结构。 我可以这样做吗?

这是我的彩票和奖励结构

type Lottery struct{
    Id int `json:"lottery_id"`
    Lottery string `json:"lottery_name"`
    Description string `json:"lottery_description"`
    Reward []Rew `json:"rewards"`
}

type Rew struct{
    Id int `json:"reward_id"`
    RewardName string `json:"reward_name"`
    Description string `json:"reward_description"`
    Asset int `json:"reward_asset"`
    AssetName string `json:"reward_asset_name"`
}

这是我的代码

app.Get("/lottery/{id:int}", func (ctx iris.Context){
        id1 := ctx.Params().GetIntDefault("id",0)

        stmtOut, err := db.Prepare("select lottery_name, lottery_description from lottery_table where id = ?")
        if err !=nil{
            panic(err.Error())
        }
        defer stmtOut.Close()

        var lottery_name, lottery_description string

        err1 := stmtOut.QueryRow(id1).Scan(&lottery_name,&lottery_description)
        if err != nil{
            panic(err1.Error())
        }

        stmtOut1, err := db.Query("select id, reward_name, reward_description, reward_asset, reward_asset_name from rewards_table where lottery_id = ?",id1)
        if err != nil{
            panic(err.Error())
        }
        defer stmtOut1.Close()

        for stmtOut1.Next() {

            var id, reward_asset int
            var reward_name, reward_description, reward_asset_name string

            err2 := stmtOut1.Scan(&id, &reward_name, &reward_description, &reward_asset, &reward_asset_name)
            if err2 != nil {
                panic(err.Error())
            }

                rew := Lottery{
                Id:          id1,
                Lottery:     lottery_name,
                Description: lottery_description,
                Reward : []Rew{Rew{
                    Id:          id,
                    RewardName:  reward_name,
                    Description: reward_description,
                    Asset:       reward_asset,
                    AssetName:   reward_asset_name,
                },
                },
            }

            ctx.JSON(&rew)
        }


    })

当我使用上面的 function 时,我得到了像这样的 JSON 格式

{
    "lottery_id": 7,
    "lottery_name": "lottery2",
    "lottery_description": "lottery for 7",
    "rewards": [
        {
            "reward_id": 9,
            "reward_name": "Reward3",
            "reward_description": "Reward for lottery 7",
            "reward_asset": 20,
            "reward_asset_name": "AC"
        }
    ]
}{
    "lottery_id": 7,
    "lottery_name": "lottery2",
    "lottery_description": "lottery for 7",
    "rewards": [
        {
            "reward_id": 10,
            "reward_name": "Reward5",
            "reward_description": "Reward for lottery 7",
            "reward_asset": 15,
            "reward_asset_name": "AC"
        }
    ]
}

但我想得到 JSON 作为

{
"lottery_id":7,
"lottery_name":"lottery2"
"lottery_description":"lottery for 7"
"rewards":[
    {
        "reward_id":9,
        "reward_name": "Reward3",
        "reward_description": "Reward for lottery 7",
        "reward_asset": 20,
        "reward_asset_name": "ABC"
    },
    {   "reward_id":10,
        "reward_name": "Reward5",
        "reward_description": "Reward for lottery 7",
        "reward_asset": 15,
        "reward_asset_name": "ABC"
    },
    {   "reward_id":11,
        "reward_name": "Reward7",
        "reward_description": "Reward for lottery 7",
        "reward_asset": 10,
        "reward_asset_name": "ABC"
    }
    ]
}

如何在结构中迭代? 结构中是否可以有 for 循环? 还是有任何其他方法可以让我得到 JSON 如上所述?

请帮我。

像这样的东西:

app.Get("/lottery/{id:int}", func(ctx iris.Context) {
    id1 := ctx.Params().GetIntDefault("id", 0)

    stmtOut, err := db.Prepare("select lottery_name, lottery_description from lottery_table where id = ?")
    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    lot := Lottery{Id: id1}
    err1 := stmtOut.QueryRow(id1).Scan(&lot.Lottery, &lot.Description)
    if err != nil {
        panic(err1.Error())
    }

    stmtOut1, err := db.Query("select id, reward_name, reward_description, reward_asset, reward_asset_name from rewards_table where lottery_id = ?", id1)
    if err != nil {
        panic(err.Error())
    }
    defer stmtOut1.Close()

    for stmtOut1.Next() {
        rew := Rew{}
        err2 := stmtOut1.Scan(&rew.Id, &rew.RewardName, &rew.Description, &rew.Asset, &rew.AssetName)
        if err2 != nil {
            panic(err.Error())
        }
        lot.Reward = append(lot.Reward, rew)

    }
    ctx.JSON(lot)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM