Switch kindToTypeMapping from map to array (#164)
Improve lookup performance by 8x.
This commit is contained in:
committed by
Thomas Pelletier
parent
5c26a6ff6f
commit
048765b449
+12
-5
@@ -6,10 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// supported values:
|
var kindToType = [reflect.String + 1]reflect.Type{
|
||||||
// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32
|
|
||||||
|
|
||||||
var kindToTypeMapping = map[reflect.Kind]reflect.Type{
|
|
||||||
reflect.Bool: reflect.TypeOf(true),
|
reflect.Bool: reflect.TypeOf(true),
|
||||||
reflect.String: reflect.TypeOf(""),
|
reflect.String: reflect.TypeOf(""),
|
||||||
reflect.Float32: reflect.TypeOf(float64(1)),
|
reflect.Float32: reflect.TypeOf(float64(1)),
|
||||||
@@ -26,6 +23,16 @@ var kindToTypeMapping = map[reflect.Kind]reflect.Type{
|
|||||||
reflect.Uint64: reflect.TypeOf(uint64(1)),
|
reflect.Uint64: reflect.TypeOf(uint64(1)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found.
|
||||||
|
// supported values:
|
||||||
|
// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32
|
||||||
|
func typeFor(k reflect.Kind) reflect.Type {
|
||||||
|
if k > 0 && int(k) < len(kindToType) {
|
||||||
|
return kindToType[k]
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func simpleValueCoercion(object interface{}) (interface{}, error) {
|
func simpleValueCoercion(object interface{}) (interface{}, error) {
|
||||||
switch original := object.(type) {
|
switch original := object.(type) {
|
||||||
case string, bool, int64, uint64, float64, time.Time:
|
case string, bool, int64, uint64, float64, time.Time:
|
||||||
@@ -82,7 +89,7 @@ func sliceToTree(object interface{}) (interface{}, error) {
|
|||||||
return tablesArray, nil
|
return tablesArray, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
sliceType := kindToTypeMapping[insideType.Kind()]
|
sliceType := typeFor(insideType.Kind())
|
||||||
if sliceType == nil {
|
if sliceType == nil {
|
||||||
sliceType = insideType
|
sliceType = insideType
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user