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
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sync pools
|
||||||
var (
|
var (
|
||||||
|
normalPool sync.Map
|
||||||
stringPool = &sync.Pool{
|
stringPool = &sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
var v string
|
var v string
|
||||||
@ -456,6 +458,18 @@ var (
|
|||||||
return &ptrV
|
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
|
// create valuer, setter when parse struct
|
||||||
@ -481,12 +495,7 @@ func (field *Field) setupValuerAndSetter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if field.NewValuePool == nil {
|
if field.NewValuePool == nil {
|
||||||
field.NewValuePool = fieldNewValuePool{
|
field.NewValuePool = poolInitializer(reflect.PtrTo(field.IndirectFieldType))
|
||||||
getter: func() interface{} {
|
|
||||||
return reflect.New(reflect.PtrTo(field.IndirectFieldType)).Interface()
|
|
||||||
},
|
|
||||||
putter: func(interface{}) {},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValueOf returns field's value and if it is zero
|
// ValueOf returns field's value and if it is zero
|
||||||
|
Loading…
x
Reference in New Issue
Block a user