mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-23 00:38:33 +02:00
refactor: simplify and optimize deserialization
This commit is contained in:
2
goutils
2
goutils
Submodule goutils updated: e907f537ac...6c698b1d55
@@ -8,6 +8,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/bytedance/sonic"
|
"github.com/bytedance/sonic"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
@@ -175,12 +176,10 @@ var getTypeInfo func(t reflect.Type) typeInfo
|
|||||||
func init() {
|
func init() {
|
||||||
m := xsync.NewMap[reflect.Type, typeInfo](xsync.WithGrowOnly(), xsync.WithPresize(100))
|
m := xsync.NewMap[reflect.Type, typeInfo](xsync.WithGrowOnly(), xsync.WithPresize(100))
|
||||||
getTypeInfo = func(t reflect.Type) typeInfo {
|
getTypeInfo = func(t reflect.Type) typeInfo {
|
||||||
if v, ok := m.Load(t); ok {
|
ti, _ := m.LoadOrCompute(t, func() (typeInfo, bool) {
|
||||||
return v
|
return initTypeKeyFieldIndexesMap(t), false
|
||||||
}
|
})
|
||||||
v := initTypeKeyFieldIndexesMap(t)
|
return ti
|
||||||
m.Store(t, v)
|
|
||||||
return v
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -537,16 +536,8 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for multiline without allocating
|
|
||||||
isMultiline := false
|
|
||||||
for i := range srcLen {
|
|
||||||
if src[i] == '\n' {
|
|
||||||
isMultiline = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// one liner is comma separated list
|
// one liner is comma separated list
|
||||||
|
isMultiline := strings.ContainsRune(src, '\n')
|
||||||
if !isMultiline && src[0] != '-' {
|
if !isMultiline && src[0] != '-' {
|
||||||
values := strutils.CommaSeperatedList(src)
|
values := strutils.CommaSeperatedList(src)
|
||||||
gi.ReflectInitSlice(dst, len(values), len(values))
|
gi.ReflectInitSlice(dst, len(values), len(values))
|
||||||
@@ -557,21 +548,19 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe
|
|||||||
errs.Add(err.Subjectf("[%d]", i))
|
errs.Add(err.Subjectf("[%d]", i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if errs.HasError() {
|
err := errs.Error()
|
||||||
return true, errs.Error()
|
return true, err
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sl := []any{}
|
sl := []any{}
|
||||||
err := yaml.Unmarshal([]byte(src), &sl)
|
err := yaml.Unmarshal(unsafe.Slice(unsafe.StringData(src), len(src)), &sl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, gperr.Wrap(err)
|
return true, gperr.Wrap(err)
|
||||||
}
|
}
|
||||||
tmp = sl
|
tmp = sl
|
||||||
case reflect.Map, reflect.Struct:
|
case reflect.Map, reflect.Struct:
|
||||||
rawMap := SerializedObject{}
|
rawMap := SerializedObject{}
|
||||||
err := yaml.Unmarshal([]byte(src), &rawMap)
|
err := yaml.Unmarshal(unsafe.Slice(unsafe.StringData(src), len(src)), &rawMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, gperr.Wrap(err)
|
return true, gperr.Wrap(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user