Go 中結構體切片之間的類型轉換
在Go 中,結構體切片之間的類型轉換可能具有挑戰性。考慮以下程式碼:
<code class="go">type Societe struct { Name string } type ListSociete []Societe func loadListSociete(name string) (ListSociete, error) { res := []struct { Name string `json:"a.name"` }{} // ... return ListSociete(res), nil }</code>
當嘗試將 res 轉換為 ListSociete 時,它會失敗,因為這些類型本質上不可互換。雖然兩者共享相似的底層結構,但 res 中 JSON 標籤的存在將它們區分開來。
關鍵區別:結構類型中的標籤
Go 規範指出兩個如果結構類型具有相同的字段、名稱、類型和標籤序列,則它們是相同的。 res 類型包含標籤 json:"a.name",它與 Societe 區分開來。
轉換選項
在這些類型之間進行轉換有兩個主要選項:
迭代和和
迭代和和<code class="go">ls := make(ListSociete, len(res)) for i := 0; i < len(res); i++ { ls[i].Name = res[i].Name }</code>
迭代和複製:
迭代res 中的每個元素,透過複製每個元素的Name 欄位來建立新的ListSociete。雖然安全,但此方法冗長且低效。<code class="go">return *(*ListSociete)(unsafe.Pointer(&res)), nil</code>
不安全轉換:
利用共享底層資料結構執行不安全操作類型轉換。但是,不建議這樣做,因為它可能會導致意外錯誤。 結論結構體切片之間的類型轉換可以是使用迭代和複製或不安全轉換來實現。選擇取決於所涉及的要求和風險。了解所涉及類型之間的差異以及任何轉換方法的潛在後果非常重要。以上是如何在 Go 中轉換具有不同 JSON 標籤的結構體切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!