为了账号安全,请及时绑定邮箱和手机立即绑定

如何将数据从一种类型复制到具有相同结构的另一种类型?

如何将数据从一种类型复制到具有相同结构的另一种类型?

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 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信