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.