Documentation
¶
Overview ¶
Package structcache provides struct and field info cache feature to enhance performance for struct converting.
Index ¶
- func GetUsedParamsKeyOrTagNameMapFromPool() map[string]struct{}
- func PutUsedParamsKeyOrTagNameMapToPool(m map[string]struct{})
- func RegisterCommonConverter(commonConverter CommonConverter)
- func RegisterCustomConvertType(fieldType reflect.Type)
- type CachedFieldInfo
- type CachedFieldInfoBase
- type CachedStructInfo
- type CommonConverter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func GetUsedParamsKeyOrTagNameMapFromPool ¶
func GetUsedParamsKeyOrTagNameMapFromPool() map[string]struct{}
GetUsedParamsKeyOrTagNameMapFromPool retrieves and returns a map for storing params key or tag name.
func PutUsedParamsKeyOrTagNameMapToPool ¶
func PutUsedParamsKeyOrTagNameMapToPool(m map[string]struct{})
PutUsedParamsKeyOrTagNameMapToPool puts a map for storing params key or tag name into pool for re-usage.
func RegisterCommonConverter ¶
func RegisterCommonConverter(commonConverter CommonConverter)
RegisterCommonConverter registers the CommonConverter for local usage.
func RegisterCustomConvertType ¶
RegisterCustomConvertType registers custom
Types ¶
type CachedFieldInfo ¶
type CachedFieldInfo struct {
// WARN:
// The [CachedFieldInfoBase] structure cannot be merged with the following [IsField] field into one structure.
// The [IsField] field should be used separately in the [bindStructWithLoopParamsMap] method
*CachedFieldInfoBase
// This field is mainly used in the [bindStructWithLoopParamsMap] method.
// This field is needed when both `fieldName` and `tag` of a field exist in the map.
// For example:
// field string `json:"name"`
// map = {
// "field" : "f1",
// "name" : "n1",
// }
// The `name` should be used here.
// In the bindStructWithLoopParamsMap method, due to the disorder of `map`, `field` may be traversed first.
// This field is more about priority, that is, the priority of `name` is higher than that of `field`,
// even if it has been set before.
IsField bool
}
CachedFieldInfo holds the cached info for struct field.
func (*CachedFieldInfo) FieldName ¶
func (cfi *CachedFieldInfo) FieldName() string
FieldName returns the field name of current field info.
func (*CachedFieldInfo) GetFieldReflectValueFrom ¶ added in v2.7.4
func (cfi *CachedFieldInfo) GetFieldReflectValueFrom(structValue reflect.Value) reflect.Value
GetFieldReflectValueFrom retrieves and returns the `reflect.Value` of given struct field, which is used for directly value assignment.
Note that, the input parameter `structValue` might be initialized internally.
func (*CachedFieldInfo) GetOtherFieldReflectValueFrom ¶ added in v2.7.4
func (cfi *CachedFieldInfo) GetOtherFieldReflectValueFrom(structValue reflect.Value, fieldIndex []int) reflect.Value
GetOtherFieldReflectValueFrom retrieves and returns the `reflect.Value` of given struct field with nested index by `fieldLevel`, which is used for directly value assignment.
Note that, the input parameter `structValue` might be initialized internally.
type CachedFieldInfoBase ¶
type CachedFieldInfoBase struct {
// FieldIndexes holds the global index number from struct info.
// The field may belong to an embedded structure, so it is defined here as []int.
FieldIndexes []int
// PriorityTagAndFieldName holds the tag value(conv, param, p, c, json) and the field name.
// PriorityTagAndFieldName contains the field name, which is the last item of slice.
PriorityTagAndFieldName []string
// IsCommonInterface marks this field implements common interfaces as:
// - iUnmarshalValue
// - iUnmarshalText
// - iUnmarshalJSON
// Purpose: reduce the interface asserting cost in runtime.
IsCommonInterface bool
// IsCustomConvert marks there custom converting function for this field type.
IsCustomConvert bool
// StructField is the type info of this field.
StructField reflect.StructField
// OtherSameNameField stores fields with the same name and type or different types of nested structures.
//
// For example:
// type ID struct{
// ID1 string
// ID2 int
// }
// type Card struct{
// ID
// ID1 uint64
// ID2 int64
// }
//
// We will cache each ID1 and ID2 separately,
// even if their types are different and their indexes are different
OtherSameNameField []*CachedFieldInfo
// ConvertFunc is the converting function for this field.
ConvertFunc func(from any, to reflect.Value)
// The last fuzzy matching key for this field.
// The fuzzy matching occurs only if there are no direct tag and field name matching in the params map.
// TODO If different paramsMaps contain paramKeys in different formats and all hit the same fieldName,
// the cached value may be continuously updated.
// LastFuzzyKey string.
LastFuzzyKey atomic.Value
// removeSymbolsFieldName is used for quick fuzzy match for parameter key.
// removeSymbolsFieldName = utils.RemoveSymbols(fieldName)
RemoveSymbolsFieldName string
}
CachedFieldInfoBase holds the cached info for struct field.
type CachedStructInfo ¶
type CachedStructInfo struct {
// All sub attributes field info slice.
FieldConvertInfos []*CachedFieldInfo
// contains filtered or unexported fields
}
CachedStructInfo holds the cached info for certain struct.
func GetCachedStructInfo ¶
func GetCachedStructInfo(structType reflect.Type, priorityTag string) *CachedStructInfo
GetCachedStructInfo retrieves or parses and returns a cached info for certain struct type. The given `structType` should be type of struct.
func (*CachedStructInfo) AddField ¶
func (csi *CachedStructInfo) AddField(field reflect.StructField, fieldIndexes []int, priorityTags []string)
func (*CachedStructInfo) GetFieldInfo ¶
func (csi *CachedStructInfo) GetFieldInfo(fieldName string) *CachedFieldInfo
func (*CachedStructInfo) HasNoFields ¶
func (csi *CachedStructInfo) HasNoFields() bool
type CommonConverter ¶
type CommonConverter struct {
Int64 func(any interface{}) int64
Uint64 func(any interface{}) uint64
String func(any interface{}) string
Float32 func(any interface{}) float32
Float64 func(any interface{}) float64
Time func(any interface{}, format ...string) time.Time
GTime func(any interface{}, format ...string) *gtime.Time
Bytes func(any interface{}) []byte
Bool func(any interface{}) bool
}
CommonConverter holds some converting functions of common types for internal usage.