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 关注
- 69 浏览
添加回答
举报