我有一个简单的程序,在该程序中,我将字节byteSlice
反序列化为ClientProduct
数组结构。然后我迭代这个ClientProduct
数组并为每个ClientProduct
构造definitions.CustomerProduct
结构。
以下是我的结构细节:
type ProductInfo struct {
Name map[Locale]map[int]string
}
type Locale string
type CustomerProduct struct {
Prs string
ProductId int64
Catalogs []int32
Categories []int
BaseProductId *int64
StatusCode int
IsActive bool
Common
}
type ValueMetrics struct {
Value string
ClientId int64
}
type Common struct {
Leagues []ValueMetrics
Teams []ValueMetrics
ProductInfo
}
下面是通过使用byteSlice
和其他辅助方法将ClientProduct
反序列化为D7
数组结构的代码。
var productRows []ClientProduct
err = json.Unmarshal(byteSlice, &productRows)
if err != nil {
return errs.Wrap(err)
}
for i := range productRows {
var flatProduct definitions.CustomerProduct
err = r.Convert(spn, &productRows[i], &flatProduct)
if err != nil {
return errs.Wrap(err)
}
if flatProduct.StatusCode == definitions.DONE {
continue
}
// populate map here from each "flatProduct"
}
下面是我的Convert
方法,它填充了我的CustomerProduct
结构。以及帮助填充CustomerProduct
结构的其他帮助方法很少。
func (r *clientRepo) Convert(span log.Span, in *ClientProduct, out *definitions.CustomerProduct) error {
commons, err := r.getCommonStruct(span, in)
if err != nil {
return errs.Wrap(err)
}
out.Common = commons
out.Catalogs = r.convertParquetIntSliceToInt32Slice(in.Catalogs)
out.Categories = in.Categories
out.ProductId = in.Id
out.IsActive = in.IsActive
out.Prs = in.PRS
out.StatusCode = in.StatusCode
return nil
}
func (r *clientRepo) getCommonStruct(span log.Span, in *ClientProduct) (definitions.Common, error) {
out := definitions.Common{}
for _, pv := range in.PropertyValues {
switch pv.Name {
case "ABC":
out.Leagues = r.concatStringSlice(pv, out.Leagues)
case "DEF":
out.Teams = r.concatStringSlice(pv, out.Teams)
}
}
for _, opv := range in.OverriddenPropertyValues {
switch opv.Name {
case "CustomerName":
if opv.Locale == "" {
// log error
} else {
out.Name = r.attach(definitions.Locale(opv.Locale), opv, out.Name)
}
}
}
return out, nil
}
func (r *clientRepo) concatStringSlice(pv PropertyValue, list []definitions.ValueMetrics) []definitions.ValueMetrics {
treeValue := definitions.ValueMetrics{Value: pv.Value, ClientId: pv.ClientId}
if list == nil {
return []definitions.ValueMetrics{treeValue}
}
return append(list, treeValue)
}
func (r *clientRepo) attach(locale definitions.Locale, opv OverriddenPropertyValue, m map[definitions.Locale]map[int]string) map[definitions.Locale]map[int]string {
if m == nil {
om := map[int]string{
opv.GroupId: opv.Value,
}
return map[definitions.Locale]map[int]string{
locale: om,
}
}
os, ok := m[locale]
if ok {
os[opv.GroupId] = opv.Value
m[locale] = os
} else {
m[locale] = map[int]string{
opv.GroupId: opv.Value,
}
}
return m
}
func (r *clientRepo) convertParquetIntSliceToInt32Slice(catalogs []int) []int32 {
var out []int32
for _, catalog := range catalogs {
out = append(out, int32(catalog))
}
return out
}
Problem语句
以上代码工作正常。基本上,我在使用所有这些辅助方法填充"CustomerProduct“的方式上寻找代码评审。有什么可以改进的吗?
CustomerProduct
方法开始的所有帮助方法来改进填充Convert
结构的方式。每当这种反序列化发生时,我就会看到一些内存波动很大,所有这些助手方法都填充了CustomerProduct
结构。如有任何指导,将不胜感激。
发布于 2022-03-17 20:50:26
在开始优化代码之前,重要的是要有一个基准测试。尽管如此,我可以提出一些一般性建议。
ProductInfo.Name
字段是一个嵌套映射,这需要分配大量的映射。与嵌套映射不同,考虑定义一个struct键类型,类似于类型NameKey struct { Locale GroupID int }类型ProductInfo struct { Name mapstring },那么getCommonStruct
可能看起来像func (r *clientRepo) getCommonStruct(span log.Span,in ClientProduct) (definitions.Common,error) { out := definitions.Common{ // Initialize。ProductInfo: definitions.ProductInfo { Name: make(mapstring),},} _,pv := range in.PropertyValues { //此部分相同。.}对于_,opv := range in.OverriddenPropertyValues { switch opv.Name { case "CustomerName":if opv.Locale ==“{.继续} //只设置映射中的值。out.Name = opv.Value }返回,0}Convert
方法可以返回一个CustomerProduct
,而不是使用out参数。我还建议使用ClientProduct的值,因为它没有被修改。concatStringSlice
帮助程序可以简化,append
在nil
:func (r *clientRepo) concatStringSlice(pv PropertyValue,list []definitions.ValueMetrics) []definitions.ValueMetrics {返回追加(list,definitions.ValueMetrics{Value: pv.Value,ClientId: pv.ClientId})上工作得很好。convertParquetIntSliceToInt32Slice
中,可以将out
预先分配到适当的大小: func (r *clientRepo) convertParquetIntSliceToInt32Slice( catalog []int) []int32 { out := make([]int32,0,len( _ )),catalog := range目录{ out = append( out,int32(catalog)) }返回}对不起,打字太晚了:)
https://codereview.stackexchange.com/questions/275038
复制相似问题