use sync.Map to store type info

This commit is contained in:
JunDao
2019-05-18 20:10:05 +08:00
parent 7953808e36
commit d3c7f45a21
3 changed files with 12 additions and 3 deletions

View File

@ -27,7 +27,6 @@ type Decoder struct {
io.ByteReader
io.Reader
}
nameless bool
}
func NewDecoder(r io.Reader) *Decoder {

View File

@ -157,6 +157,7 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte, tagName string) err
return err
}
}
case TagCompound:
if vk := val.Kind(); vk != reflect.Struct {
return errors.New("cannot parse TagCompound as " + vk.String())
@ -252,7 +253,7 @@ func (d *Decoder) readTag() (tagType byte, tagName string, err error) {
return
}
if tagType != TagEnd && !d.nameless { //Read Tag
if tagType != TagEnd { //Read Tag
tagName, err = d.readString()
}
return

View File

@ -2,6 +2,7 @@ package nbt
import (
"reflect"
"sync"
)
type typeInfo struct {
@ -9,7 +10,13 @@ type typeInfo struct {
nameToIndex map[string]int
}
var tinfoMap sync.Map
func getTypeInfo(typ reflect.Type) *typeInfo {
if ti, ok := tinfoMap.Load(typ); ok {
return ti.(*typeInfo)
}
tinfo := new(typeInfo)
tinfo.nameToIndex = make(map[string]int)
if typ.Kind() == reflect.Struct {
@ -27,7 +34,9 @@ func getTypeInfo(typ reflect.Type) *typeInfo {
}
}
}
return tinfo
ti, _ := tinfoMap.LoadOrStore(typ, tinfo)
return ti.(*typeInfo)
}
func (t *typeInfo) findIndexByName(name string) int {