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
相关产品推荐
相关产品推荐

