1 回答

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
- 1 回答
- 0 關注
- 82 瀏覽
添加回答
舉報