Add poolInitializer
This commit is contained in:
parent
20abf83a21
commit
6393ad5222
@ -413,7 +413,9 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
||||
return field
|
||||
}
|
||||
|
||||
// sync pools
|
||||
var (
|
||||
normalPool sync.Map
|
||||
stringPool = &sync.Pool{
|
||||
New: func() interface{} {
|
||||
var v string
|
||||
@ -456,6 +458,18 @@ var (
|
||||
return &ptrV
|
||||
},
|
||||
}
|
||||
poolInitializer = func(reflectType reflect.Type) FieldNewValuePool {
|
||||
if v, ok := normalPool.Load(reflectType); ok {
|
||||
return v.(FieldNewValuePool)
|
||||
}
|
||||
|
||||
v, _ := normalPool.LoadOrStore(reflectType, &sync.Pool{
|
||||
New: func() interface{} {
|
||||
return reflect.New(reflectType).Interface()
|
||||
},
|
||||
})
|
||||
return v.(FieldNewValuePool)
|
||||
}
|
||||
)
|
||||
|
||||
// create valuer, setter when parse struct
|
||||
@ -481,12 +495,7 @@ func (field *Field) setupValuerAndSetter() {
|
||||
}
|
||||
|
||||
if field.NewValuePool == nil {
|
||||
field.NewValuePool = fieldNewValuePool{
|
||||
getter: func() interface{} {
|
||||
return reflect.New(reflect.PtrTo(field.IndirectFieldType)).Interface()
|
||||
},
|
||||
putter: func(interface{}) {},
|
||||
}
|
||||
field.NewValuePool = poolInitializer(reflect.PtrTo(field.IndirectFieldType))
|
||||
}
|
||||
|
||||
// ValueOf returns field's value and if it is zero
|
||||
|
Loading…
x
Reference in New Issue
Block a user