structcache

package
v2.7.3 Latest Latest
Warning

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

Go to latest
Published: Sep 9, 2024 License: MIT Imports: 9 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.

func RegisterCommonConverter

func RegisterCommonConverter(commonConverter CommonConverter)

RegisterCommonConverter registers the CommonConverter for local usage.

func RegisterCustomConvertType

func RegisterCustomConvertType(fieldType reflect.Type)

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) GetFieldReflectValue

func (cfi *CachedFieldInfo) GetFieldReflectValue(structValue reflect.Value) reflect.Value

GetFieldReflectValue retrieves and returns the reflect.Value of given struct value, which is used for directly value assignment.

func (*CachedFieldInfo) GetOtherFieldReflectValue

func (cfi *CachedFieldInfo) GetOtherFieldReflectValue(structValue reflect.Value, fieldLevel int) reflect.Value

GetOtherFieldReflectValue retrieves and returns the reflect.Value of given struct value with nested index by `fieldLevel`, which is used for directly value assignment.

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

	// OtherSameNameFieldIndex holds the sub attributes of the same field name.
	// For example:
	// type Name struct{
	//     LastName  string
	//     FirstName string
	// }
	// type User struct{
	//     Name
	//     LastName  string
	//     FirstName string
	// }
	//
	// As the `LastName` in `User`, its internal attributes:
	//   FieldIndexes = []int{0,1}
	//   // item length 1, as there's only one repeat item with the same field name.
	//   OtherSameNameFieldIndex = [][]int{[]int{1}}
	//
	// In value assignment, the value will be assigned to index {0,1} and {1}.
	OtherSameNameFieldIndex [][]int

	// 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.

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.

Jump to

Keyboard shortcuts

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