reflectx

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Mar 6, 2021 License: Apache-2.0 Imports: 4 Imported by: 0

README

reflectx

The sqlx package has special reflect needs. In particular, it needs to:

  • be able to map a name to a field
  • understand embedded structs
  • understand mapping names to fields by a particular tag
  • user specified name -> field mapping functions

These behaviors mimic the behaviors by the standard library marshallers and also the behavior of standard Go accessors.

The first two are amply taken care of by Reflect.Value.FieldByName, and the third is addressed by Reflect.Value.FieldByNameFunc, but these don't quite understand struct tags in the ways that are vital to most marshallers, and they are slow.

This reflectx package extends reflect to achieve these goals.

Documentation

Overview

软件包 reflects 实现了对标准反射库的扩展,适用于实现编组和解组软件包。

主要的Mapper类型允许Go兼容的命名属性访问,包括访问嵌入的struct属性以及使用函数和struct标记来自定义字段名称的能力。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FieldByIndexes

func FieldByIndexes(v reflect.Value, indexes []int) reflect.Value

FieldByIndexes 为给定值返回结构遍历所给定字段的值。

func FieldByIndexesReadOnly

func FieldByIndexesReadOnly(v reflect.Value, indexes []int) reflect.Value

FieldByIndexesReadOnly 返回用于特定结构遍历的值,但与分配nil指针无关,因为该值将用于读取而不是设置。

func Indirect

func Indirect(t reflect.Type) reflect.Type

Indirect (原Deref) 对于reflect.Types是间接的

Types

type FieldInfo

type FieldInfo struct {
	Index    []int
	Path     string
	Field    reflect.StructField
	Zero     reflect.Value
	Name     string
	Options  map[string]string
	Embedded bool
	Children []*FieldInfo
	Parent   *FieldInfo
}

FieldInfo 是结构体字段的元数据。是对 reflect.StructField 的扩展。

type Mapper

type Mapper struct {
	// contains filtered or unexported fields
}

Mapper 是名称到结构字段的通用映射器。

映射器的行为类似于标准库中的大多数编组器,它遵循用于名称映射的字段标签,但也提供了基本的转换功能。

func NewMapper

func NewMapper(tagName string) *Mapper

NewMapper 使用tagName作为其结构字段标签返回一个新的映射器。如果tagName是空字符串,则将其忽略。

func NewMapperFunc

func NewMapperFunc(tagName string, f func(string) string) *Mapper

NewMapperFunc 返回一个新的映射器,该映射器可以选择服从f给出的字段标签和结构字段名称映射器func。

标签将优先,但是对于任何其他字段,映射的名称将为f(field.Name)

func NewMapperTagFunc

func NewMapperTagFunc(tagName string, mapFunc, tagMapFunc func(string) string) *Mapper

NewMapperTagFunc 返回一个新的映射器,其中包含用于字段名称的映射器和用于标记值的映射器。

这对于像json这样的标签很有用,该标签可以具有“ name,omitempty”之类的值。

func (*Mapper) FieldByName

func (m *Mapper) FieldByName(v reflect.Value, name string) reflect.Value

FieldByName 通过其映射名称返回字段,即 reflect.Value。

如果v的Kind不是Struct或v不可间接访问结构Kind,则感到恐慌。如果找不到名称,则返回零值。

func (*Mapper) FieldMap

func (m *Mapper) FieldMap(v reflect.Value) map[string]reflect.Value

FieldMap 返回映射器的字段名称映射到 reflect.Value.

如果v的Kind不是Struct或v不可间接访问结构种类,则发生恐慌。

func (*Mapper) FieldsByName

func (m *Mapper) FieldsByName(v reflect.Value, names []string) []reflect.Value

FieldsByName 返回与值的名称切片相对应的值切片。

如果v的Kind不是Struct或v不可间接访问结构Kind,则感到恐慌。对于找不到的每个名称,返回零值。

func (*Mapper) TraversalsByName

func (m *Mapper) TraversalsByName(t reflect.Type, names []string) [][]int

TraversalsByName 返回一个int slices的切片,该切片代表每个映射名称的结构遍历。

如果t不是一个结构或该结构不是可间接访问的,则感到恐慌。对于找不到的每个名称,返回空的int切片。

func (*Mapper) TraversalsByNameFunc

func (m *Mapper) TraversalsByNameFunc(t reflect.Type, names []string, fn func(int, []int) error) error

TraversalsByNameFunc 遍历映射的名称,并使用每个名称的索引和该名称表示的结构遍历调用fn。

如果t不是一个结构或该结构不是可间接访问的,则感到恐慌。返回fn或nil返回的第一个错误。

func (*Mapper) TypeMap

func (m *Mapper) TypeMap(t reflect.Type) *StructMap

TypeMap 返回字段字符串到int切片的映射,这些切片代表遍历结构到达该字段的遍历。

type StructMap

type StructMap struct {
	Tree  *FieldInfo
	Index []*FieldInfo
	Paths map[string]*FieldInfo
	Names map[string]*FieldInfo
}

StructMap 是结构体的字段元数据的索引。

func (StructMap) GetByPath

func (f StructMap) GetByPath(path string) *FieldInfo

GetByPath 返回给定字符串路径的 FieldInfo

func (StructMap) GetByTraversal

func (f StructMap) GetByTraversal(index []int) *FieldInfo

GetByTraversal 返回给定整数路径的FieldInfo。

它类似于 reflect.FieldByIndex 但是使用缓存的遍历而不是每次都重新执行反射机制。

Jump to

Keyboard shortcuts

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