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

Go语言中如何向元素为匿名结构体的切片追加元素

问题:向嵌套匿名结构体切片追加元素

现有如下Go结构体定义:

type ResponseQueryHotel struct {
    QueryString *string `json:"queryString"`
    Status   string `json:"status"`
    Action   string `json:"action"`
    RefCode  string `json:"refCode"`
    Vendorid string `json:"vendorid"`
    SearchToken *string `json:"searchtoken"`
    Data     struct {
        Hotels []struct {
            Data ResponseQueryHotelsData `json:"data"`
        } `json:"hotels"`
    } `json:"data"`
}

type ResponseQueryHotelsData struct {
    Hotelidvendor      string `json:"hotelidvendor"`
    Hotelname          string `json:"hotelname"`
    Hoteladdress       string `json:"hoteladdress"`
    Hoteldistrict      string `json:"hoteldistrict"`
    Hotelcity          string `json:"hotelcity"`
    Hotelprovince      string `json:"hotelprovince"`
    Hotelcountry       string `json:"hotelcountry"`
    Hotellat           string `json:"hotellat"`
    Hotellng           string `json:"hotellng"`
    Hotelprice         string `json:"hotelprice"`
    Hoteldiscountprice string `json:"hoteldiscountprice"`
    Hotelphotourl      string `json:"hotelphotourl"`
}

尝试向output.Data.Hotels切片追加元素时,使用了以下代码:

var output models.ResponseQueryHotel

var data models.ResponseQueryHotelsData
output.Data.Hotels = append(output.Data.Hotels, data)

触发错误:

cannot use data (variable of type models.ResponseQueryHotelsData) as struct{Data models.ResponseQueryHotelsData "json:\"data\""} value in argument to append

在无法修改原有结构体的前提下,如何向output.Data.Hotels追加多个ResponseQueryHotelsData类型的元素?


解决方案

错误根源是类型不匹配:Hotels切片的元素类型是包含Data字段的匿名结构体(struct{Data models.ResponseQueryHotelsData}),而非直接的ResponseQueryHotelsData类型。只需将ResponseQueryHotelsData实例包装为该匿名结构体类型,即可正常追加。

1. 单个元素追加

直接在append调用中构造匿名结构体:

var output models.ResponseQueryHotel
var data models.ResponseQueryHotelsData
// 填充data的各个字段...
output.Data.Hotels = append(output.Data.Hotels, struct{ Data models.ResponseQueryHotelsData }{Data: data})

2. 批量追加多个元素

如果有多个ResponseQueryHotelsData实例,可通过循环逐个包装后追加:

var output models.ResponseQueryHotel
// 假设已有多个ResponseQueryHotelsData实例的列表
dataList := []models.ResponseQueryHotelsData{
    {Hotelname: "酒店A", Hoteladdress: "地址A"},
    {Hotelname: "酒店B", Hoteladdress: "地址B"},
}

for _, d := range dataList {
    output.Data.Hotels = append(output.Data.Hotels, struct{ Data models.ResponseQueryHotelsData }{Data: d})
}

内容的提问来源于stack exchange,提问作者Rakai Seto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:15:14