如何在Golang中追加到元素类型不是命名类型的切片

yeotifhr  于 2023-04-18  发布在  Go
关注(0)|答案(2)|浏览(139)

我有两个struct:

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"`
}

现在我需要向ResponseQueryHotel.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(将有超过1个ResponseQueryHotelsData要追加)。
顺便说一句,我不能改变结构(这是我的控制)。

pkmbmrz7

pkmbmrz71#

如果需要多次使用相同的基础类型,请定义该类型的别名:

type Hotel = struct {
    Data ResponseQueryHotelsData `json:"data"`
}
hotels := []Hotel{
    {Data: ResponseQueryHotelsData{}},
    {Data: ResponseQueryHotelsData{}},
}

output.Data.Hotels = append(output.Data.Hotels, hotels...)

或者,如果您只需要一次,则在适当的位置声明结构类型:

hotels := []struct {
    Data ResponseQueryHotelsData `json:"data"`
}{
    {Data: ResponseQueryHotelsData{}},
    {Data: ResponseQueryHotelsData{}},
}

output.Data.Hotels = append(output.Data.Hotels, hotels...)

golang规范中的Assignability部分规定:
如果以下条件之一适用,则类型V的值x可分配给类型T的变量(“x可分配给T”):

  • V和T相同。
    *V和T具有相同的基础类型,但不是类型参数,并且V或T中至少有一个不是命名类型。
  • V和T是具有相同元素类型的通道类型,V是双向通道,并且V或T中至少有一个不是命名类型。
  • T是一个接口类型,但不是类型参数,而x实现了T。
  • x是预先声明的标识符nil,T是指针、函数、切片、Map、通道或接口类型,但不是类型参数。
  • x是一个无类型的常量,可以用T类型的值表示。
fzwojiic

fzwojiic2#

您可以将字段Data.Hotels的类型更改为[]ResponseQueryHotelsData而不是struct。

相关问题