亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將數據從一種類型復制到具有相同結構的另一種類型?

如何將數據從一種類型復制到具有相同結構的另一種類型?

Go
ibeautiful 2022-09-05 09:25:39
在下面的代碼中:type ProductEntity struct {    ID          int     `json:"id"`    Name        string  `json:"name"`    Description string  `json:"description"`    Price       float32 `json:"price"`    SKU         string  `json:"sku"`    CreatedOn   string  `json:"-"`    UpdatedOn   string  `json:"-"`    DeletedOn   string  `json:"-"`}type ProductEntityList []*ProductEntitytype PostRequestModel struct {    ID          int     `json:"id"`    Name        string  `json:"name"`    Description string  `json:"description"`    Price       float32 `json:"price"`    SKU         string  `json:"sku"`    CreatedOn   string  `json:"-"`    UpdatedOn   string  `json:"-"`    DeletedOn   string  `json:"-"`}type RequestBody []*PostRequestModelfunc convertModelToEntity(modelList RequestBody) ProductEntityList {    // return entity.ProductEntityList(modelList) // type conversion error }如何將數據從一種類型復制到具有相同結構的另一種類型?因為 和 是兩個不同的類型定義RequestBodyProductEntityList
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

如果這些類型確實相等,請使用類型別名:


type PostRequestModel = ProductEntity

如果您這樣做,您可以簡單地從 轉換為(在Go Playground上嘗試):ProductEntityListRequestBody


func convertModelToEntity(modelList RequestBody) ProductEntityList {

    return ProductEntityList(modelList) // Works!!

}

如果無法使用類型別名,則無法從一個切片轉換為另一個切片。您必須創建一個新切片。請注意,您可以轉換各個切片元素,因為指向的結構類型具有相同的字段。這是可能的,因為規范:轉換:


在以下任何一種情況下,非常量值都可以轉換為類型:xT


[...]

忽略結構標記(見下文)、的類型 和 是未定義類型的指針類型,它們的指針基類型具有相同的基礎類型。xT

因此可以轉換為(反之亦然),因為 的基礎類型 和 是 “相同” 的結構類型。*ProductEntity*PostRequestModelProductEntityPostRequestModel


在Go Playground上嘗試一下:


func convertModelToEntity(modelList RequestBody) ProductEntityList {

    r := make(ProductEntityList, len(modelList))

    for i, m := range modelList {

        r[i] = (*ProductEntity)(m)

    }

    return r

}

還要注意,如果 并且具有相同的內存布局(在您的示例中確實如此),則可以使用包不安全來簡單地轉換它們,但我寧愿避免使用它(在Go Playground上嘗試):RequestBodyProductEntityList


func convertModelToEntity(modelList RequestBody) ProductEntityList {

    return *(*ProductEntityList)(unsafe.Pointer(&modelList))

}

為什么要避免這種情況?使用程序包時,你的應用可能會變得不可移植,并且 Go 1 兼容性保證可能不適用于它。例如,您可以僅向 添加字段,但不能向 添加字段。因此,您的應用將繼續編譯而不會出現錯誤,但可能隨時崩潰。始終將包裝視為最后的手段。unsafeProductEntityPostRequestModelunsafe


查看完整回答
反對 回復 2022-09-05
  • 1 回答
  • 0 關注
  • 82 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號