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{})
- type AnyConvertFunc
- type CachedFieldInfo
- type CachedFieldInfoBase
- type CachedStructInfo
- func (csi *CachedStructInfo) AddField(field reflect.StructField, fieldIndexes []int, priorityTags []string)
- func (csi *CachedStructInfo) GetFieldConvertInfos() []*CachedFieldInfo
- func (csi *CachedStructInfo) GetFieldInfo(fieldName string) *CachedFieldInfo
- func (csi *CachedStructInfo) HasNoFields() bool
- type Converter
- func (cf *Converter) GetAnyConvertFuncByType(dstType reflect.Type) AnyConvertFunc
- func (cf *Converter) GetCachedStructInfo(structType reflect.Type, priorityTag string) *CachedStructInfo
- func (cf *Converter) IsAnyConvertFuncEmpty() bool
- func (cf *Converter) MarkTypeConvertFunc(fieldType reflect.Type)
- func (cf *Converter) RegisterAnyConvertFunc(dstType reflect.Type, convertFunc AnyConvertFunc)
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.
Types ¶
type AnyConvertFunc ¶ added in v2.9.0
AnyConvertFunc is the function type for converting any to specified type. Note that the parameter `to` is usually a pointer type.
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
// HasCustomConvert marks there custom converting function for this field type.
// A custom converting function is a function that user defined for converting specified type
// to another type.
HasCustomConvert 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 AnyConvertFunc
// 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 {
// contains filtered or unexported fields
}
CachedStructInfo holds the cached info for certain struct.
func NewCachedStructInfo ¶ added in v2.9.0
func NewCachedStructInfo(converter *Converter) *CachedStructInfo
NewCachedStructInfo creates and returns a new CachedStructInfo object.
func (*CachedStructInfo) AddField ¶
func (csi *CachedStructInfo) AddField(field reflect.StructField, fieldIndexes []int, priorityTags []string)
func (*CachedStructInfo) GetFieldConvertInfos ¶ added in v2.9.0
func (csi *CachedStructInfo) GetFieldConvertInfos() []*CachedFieldInfo
func (*CachedStructInfo) GetFieldInfo ¶
func (csi *CachedStructInfo) GetFieldInfo(fieldName string) *CachedFieldInfo
func (*CachedStructInfo) HasNoFields ¶
func (csi *CachedStructInfo) HasNoFields() bool
type Converter ¶ added in v2.9.0
type Converter struct {
// contains filtered or unexported fields
}
Converter is the configuration for type converting.
func NewConverter ¶ added in v2.9.0
func NewConverter() *Converter
NewConverter creates and returns a new Converter object.
func (*Converter) GetAnyConvertFuncByType ¶ added in v2.9.0
func (cf *Converter) GetAnyConvertFuncByType(dstType reflect.Type) AnyConvertFunc
GetAnyConvertFuncByType retrieves and returns the converting function for specified type.
func (*Converter) GetCachedStructInfo ¶ added in v2.9.0
func (cf *Converter) 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 (*Converter) IsAnyConvertFuncEmpty ¶ added in v2.9.0
IsAnyConvertFuncEmpty checks whether there's any converting function registered.
func (*Converter) MarkTypeConvertFunc ¶ added in v2.9.0
MarkTypeConvertFunc marks converting function registered for custom type.
func (*Converter) RegisterAnyConvertFunc ¶ added in v2.9.0
func (cf *Converter) RegisterAnyConvertFunc(dstType reflect.Type, convertFunc AnyConvertFunc)
RegisterAnyConvertFunc registers custom type converting function for specified type.