Bladeren bron

get decoder without get type first

Tao Wen 7 jaren geleden
bovenliggende
commit
820ec30bd6
1 gewijzigde bestanden met toevoegingen van 9 en 5 verwijderingen
  1. 9 5
      reflect.go

+ 9 - 5
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")