From 820ec30bd6df8566e9ca0a569beeaf6993de3028 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Thu, 22 Feb 2018 10:18:27 +0800 Subject: [PATCH] get decoder without get type first --- reflect.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/reflect.go b/reflect.go index 95d2002..21ec130 100644 --- a/reflect.go +++ b/reflect.go @@ -51,12 +51,16 @@ func (b *ctx) append(prefix string) *ctx { // ReadVal copy the underlying JSON into go interface, same as json.Unmarshal func (iter *Iterator) ReadVal(obj interface{}) { - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - iter.ReportError("ReadVal", "can only unmarshal into pointer") - return + cacheKey := reflect2.RTypeOf(obj) + decoder := iter.cfg.getDecoderFromCache(cacheKey) + if decoder == nil { + typ := reflect2.TypeOf(obj) + if typ.Kind() != reflect.Ptr { + iter.ReportError("ReadVal", "can only unmarshal into pointer") + return + } + decoder = iter.cfg.DecoderOf(typ) } - decoder := iter.cfg.DecoderOf(typ) ptr := reflect2.PtrOf(obj) if ptr == nil { iter.ReportError("ReadVal", "can not read into nil pointer")