|
|
|
@ -37,44 +37,14 @@ const ( |
|
|
|
|
mapIndexFieldName = "%s[%v]" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var structPool *pool |
|
|
|
|
var structPool *sync.Pool |
|
|
|
|
|
|
|
|
|
// Pool holds a channelStructErrors.
|
|
|
|
|
type pool struct { |
|
|
|
|
pool chan *StructErrors |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NewPool creates a new pool of Clients.
|
|
|
|
|
func newPool(max int) *pool { |
|
|
|
|
return &pool{ |
|
|
|
|
pool: make(chan *StructErrors, max), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Borrow a StructErrors from the pool.
|
|
|
|
|
func (p *pool) Borrow() *StructErrors { |
|
|
|
|
var c *StructErrors |
|
|
|
|
|
|
|
|
|
select { |
|
|
|
|
case c = <-p.pool: |
|
|
|
|
default: |
|
|
|
|
c = &StructErrors{ |
|
|
|
|
// returns new *StructErrors to the pool
|
|
|
|
|
func newStructErrors() interface{} { |
|
|
|
|
return &StructErrors{ |
|
|
|
|
Errors: map[string]*FieldError{}, |
|
|
|
|
StructErrors: map[string]*StructErrors{}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return c |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Return returns a StructErrors to the pool.
|
|
|
|
|
func (p *pool) Return(c *StructErrors) { |
|
|
|
|
|
|
|
|
|
select { |
|
|
|
|
case p.pool <- c: |
|
|
|
|
default: |
|
|
|
|
// let it go, let it go...
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type cachedTags struct { |
|
|
|
@ -357,7 +327,7 @@ type Validate struct { |
|
|
|
|
// New creates a new Validate instance for use.
|
|
|
|
|
func New(tagName string, funcs map[string]Func) *Validate { |
|
|
|
|
|
|
|
|
|
structPool = newPool(10) |
|
|
|
|
structPool = &sync.Pool{New: newStructErrors} |
|
|
|
|
|
|
|
|
|
return &Validate{ |
|
|
|
|
tagName: tagName, |
|
|
|
@ -377,9 +347,8 @@ func (v *Validate) SetTag(tagName string) { |
|
|
|
|
// nearly all cases. only increase if you have a deeply nested struct structure.
|
|
|
|
|
// NOTE: this method is not thread-safe
|
|
|
|
|
// NOTE: this is only here to keep compatibility with v5, in v6 the method will be removed
|
|
|
|
|
// and the max pool size will be passed into the New function
|
|
|
|
|
func (v *Validate) SetMaxStructPoolSize(max int) { |
|
|
|
|
structPool = newPool(max) |
|
|
|
|
structPool = &sync.Pool{New: newStructErrors} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// AddFunction adds a validation Func to a Validate's map of validators denoted by the key
|
|
|
|
@ -440,7 +409,7 @@ func (v *Validate) structRecursive(top interface{}, current interface{}, s inter |
|
|
|
|
cs = &cachedStruct{name: structName, children: numFields} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
validationErrors := structPool.Borrow() |
|
|
|
|
validationErrors := structPool.Get().(*StructErrors) |
|
|
|
|
validationErrors.Struct = structName |
|
|
|
|
|
|
|
|
|
for i := 0; i < numFields; i++ { |
|
|
|
@ -617,7 +586,7 @@ func (v *Validate) structRecursive(top interface{}, current interface{}, s inter |
|
|
|
|
structCache.Set(structType, cs) |
|
|
|
|
|
|
|
|
|
if len(validationErrors.Errors) == 0 && len(validationErrors.StructErrors) == 0 { |
|
|
|
|
structPool.Return(validationErrors) |
|
|
|
|
structPool.Put(validationErrors) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|