code: func newDecodePool(f DecoderFunc) *decoderPool {
  	// get a new decoder and type assert to see if it can be reset
  	d := f(nil)
  	rd, ok := d.(ResettableDecoder)
  
  	p := &decoderPool{fn: f}
  
  	// if the decoder can be reset, create a pool and put the typed decoder in
  	if ok {
  		p.pool = &sync.Pool{
  			New: func() interface{} { return f(nil) },
  		}
  		p.pool.Put(rd)
  	}
  
  	return p
  }
docs: // newDecodePool checks to see if the DecoderFunc returns reusable decoders and if so, creates a
  // pool.