structcache

package
v2.9.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2025 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

Package structcache provides struct and field info cache feature to enhance performance for struct converting.

Index

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

type AnyConvertFunc func(from any, to reflect.Value) error

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

func (cf *Converter) IsAnyConvertFuncEmpty() bool

IsAnyConvertFuncEmpty checks whether there's any converting function registered.

func (*Converter) MarkTypeConvertFunc added in v2.9.0

func (cf *Converter) MarkTypeConvertFunc(fieldType reflect.Type)

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL