首頁  >  文章  >  後端開發  >  如何附加到元素類型不是golang中命名類型的切片

如何附加到元素類型不是golang中命名類型的切片

WBOY
WBOY轉載
2024-02-09 10:50:191134瀏覽

如何附加到元素類型不是golang中命名類型的切片

php小編香蕉為您介紹如何附加到元素類型不是golang中命名類型的切片。在Golang中,我們可以使用內建的append函數將元素附加到切片中,但是如果切片的元素類型不是命名類型,即匿名類型,我們需要先建立一個臨時切片,然後將元素附加到臨時切片中,最後再將臨時切片的元素複製回原始切片。這樣做可以確保在附加元素時不會遺失原始切片的資料。接下來,我們將詳細介紹這個過程的具體步驟。

問題內容

我有兩個結構:

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 附加)。

順便說一句,我無法更改結構(它超出了我的控制範圍)。

解決方法

如果您需要多次使用它,請為相同的基礎類型定義別名:

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 規範中的可分配性部分指出:

如果滿足下列條件之一,則 v 類型的值 x 可指派給 t 類型的變數(「x 可指派給 t」):

  • v 和 t 相同。
  • v 和 t 具有相同的基礎類型,但不是類型參數,且 v 或 t 中至少有一個不是命名類型。
  • v 和 t 是具有相同元素類型的通道類型,v 是雙向通道,且 v 或 t 中至少有一個不是命名類型。
  • t 是介面類型,但不是型別參數,且 x 實作 t。
  • x 是預先宣告的標識符 nil,t 是指標、函數、切片、映射、通道或介面類型,但不是類型參數。
  • x 是一個無型別常數,可由型別 t 的值表示。

以上是如何附加到元素類型不是golang中命名類型的切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除