1
0
mirror of https://github.com/json-iterator/go.git synced 2025-04-20 11:28:49 +02:00

use specific type

This commit is contained in:
Tao Wen 2016-12-08 08:37:20 +08:00
parent c37cf3ea36
commit 871e545b48
2 changed files with 30 additions and 30 deletions

View File

@ -148,12 +148,12 @@ func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
} }
} }
type structDecoder struct { type generalStructDecoder struct {
type_ reflect.Type type_ reflect.Type
fields map[string]Decoder fields map[string]*structFieldDecoder
} }
func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() { for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
fieldDecoder := decoder.fields[field] fieldDecoder := decoder.fields[field]
if fieldDecoder == nil { if fieldDecoder == nil {
@ -181,7 +181,7 @@ func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
type oneFieldStructDecoder struct { type oneFieldStructDecoder struct {
type_ reflect.Type type_ reflect.Type
fieldName string fieldName string
fieldDecoder Decoder fieldDecoder *structFieldDecoder
} }
func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
@ -200,9 +200,9 @@ func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator)
type twoFieldsStructDecoder struct { type twoFieldsStructDecoder struct {
type_ reflect.Type type_ reflect.Type
fieldName1 string fieldName1 string
fieldDecoder1 Decoder fieldDecoder1 *structFieldDecoder
fieldName2 string fieldName2 string
fieldDecoder2 Decoder fieldDecoder2 *structFieldDecoder
} }
func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
@ -224,11 +224,11 @@ func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator
type threeFieldsStructDecoder struct { type threeFieldsStructDecoder struct {
type_ reflect.Type type_ reflect.Type
fieldName1 string fieldName1 string
fieldDecoder1 Decoder fieldDecoder1 *structFieldDecoder
fieldName2 string fieldName2 string
fieldDecoder2 Decoder fieldDecoder2 *structFieldDecoder
fieldName3 string fieldName3 string
fieldDecoder3 Decoder fieldDecoder3 *structFieldDecoder
} }
func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
@ -252,13 +252,13 @@ func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterat
type fourFieldsStructDecoder struct { type fourFieldsStructDecoder struct {
type_ reflect.Type type_ reflect.Type
fieldName1 string fieldName1 string
fieldDecoder1 Decoder fieldDecoder1 *structFieldDecoder
fieldName2 string fieldName2 string
fieldDecoder2 Decoder fieldDecoder2 *structFieldDecoder
fieldName3 string fieldName3 string
fieldDecoder3 Decoder fieldDecoder3 *structFieldDecoder
fieldName4 string fieldName4 string
fieldDecoder4 Decoder fieldDecoder4 *structFieldDecoder
} }
func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) { func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
@ -538,7 +538,7 @@ func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
} }
func decoderOfStruct(type_ reflect.Type) (Decoder, error) { func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
fields := map[string]Decoder{} fields := map[string]*structFieldDecoder{}
for i := 0; i < type_.NumField(); i++ { for i := 0; i < type_.NumField(); i++ {
field := type_.Field(i) field := type_.Field(i)
fieldDecoderKey := fmt.Sprintf("%s/%s", type_.String(), field.Name) fieldDecoderKey := fmt.Sprintf("%s/%s", type_.String(), field.Name)
@ -572,8 +572,8 @@ func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
case 2: case 2:
var fieldName1 string var fieldName1 string
var fieldName2 string var fieldName2 string
var fieldDecoder1 Decoder var fieldDecoder1 *structFieldDecoder
var fieldDecoder2 Decoder var fieldDecoder2 *structFieldDecoder
for fieldName, fieldDecoder := range fields { for fieldName, fieldDecoder := range fields {
if fieldName1 == "" { if fieldName1 == "" {
fieldName1 = fieldName fieldName1 = fieldName
@ -588,9 +588,9 @@ func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
var fieldName1 string var fieldName1 string
var fieldName2 string var fieldName2 string
var fieldName3 string var fieldName3 string
var fieldDecoder1 Decoder var fieldDecoder1 *structFieldDecoder
var fieldDecoder2 Decoder var fieldDecoder2 *structFieldDecoder
var fieldDecoder3 Decoder var fieldDecoder3 *structFieldDecoder
for fieldName, fieldDecoder := range fields { for fieldName, fieldDecoder := range fields {
if fieldName1 == "" { if fieldName1 == "" {
fieldName1 = fieldName fieldName1 = fieldName
@ -610,10 +610,10 @@ func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
var fieldName2 string var fieldName2 string
var fieldName3 string var fieldName3 string
var fieldName4 string var fieldName4 string
var fieldDecoder1 Decoder var fieldDecoder1 *structFieldDecoder
var fieldDecoder2 Decoder var fieldDecoder2 *structFieldDecoder
var fieldDecoder3 Decoder var fieldDecoder3 *structFieldDecoder
var fieldDecoder4 Decoder var fieldDecoder4 *structFieldDecoder
for fieldName, fieldDecoder := range fields { for fieldName, fieldDecoder := range fields {
if fieldName1 == "" { if fieldName1 == "" {
fieldName1 = fieldName fieldName1 = fieldName
@ -633,7 +633,7 @@ func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
fieldName4, fieldDecoder4}, nil fieldName4, fieldDecoder4}, nil
} }
return &structDecoder{type_, fields}, nil return &generalStructDecoder{type_, fields}, nil
} }
func decoderOfSlice(type_ reflect.Type) (Decoder, error) { func decoderOfSlice(type_ reflect.Type) (Decoder, error) {

View File

@ -285,12 +285,12 @@ type StructOfTagOne struct {
func Benchmark_jsoniter_reflect(b *testing.B) { func Benchmark_jsoniter_reflect(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
//iter := ParseString(`{"field3": "100"}`) iter := ParseString(`{"field3": "100"}`)
//struct_ := StructOfTagOne{} struct_ := StructOfTagOne{}
//iter.Read(&struct_) iter.Read(&struct_)
iter := ParseString(`[1,2,3]`) //iter := ParseString(`[1,2,3]`)
var array []int //var array []int
iter.Read(&array) //iter.Read(&array)
} }
} }