Help us shape the future of Go! Take the 2026 Go Developer Survey

reflectx

package
v1.0.0 Latest Latest
Warning

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

Go to latest
Published: Aug 14, 2026 License: MIT Imports: 4 Imported by: 0

README

reflectx

dbx 包有特殊的反射需求。特别是,它需要:

  • 将名称映射到字段
  • 理解嵌入结构体
  • 通过特定标签理解名称到字段的映射
  • 用户指定的名称到字段映射函数

这些行为模仿了标准库序列化器的行为以及标准 Go 访问器的行为。

前两个功能由 Reflect.Value.FieldByName 充分处理,第三个由 Reflect.Value.FieldByNameFunc 处理,但它们不太理解结构体标签, 而这些标签对大多数序列化器至关重要,而且它们速度很慢。

此 reflectx 包扩展了 reflect 以实现这些目标。

Documentation

Overview

Package reflectx 实现了对标准 reflect 库的扩展,适用于实现序列化和 反序列化包。主要的 Mapper 类型支持兼容 Go 风格的命名属性访问,包括 访问嵌入结构体属性的能力,以及使用函数和结构体标签来自定义字段名称。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Deref

func Deref(t reflect.Type) reflect.Type

Deref 是 reflect.Type 的间接寻址。

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 指针,因为该值将用于读取而非设置。

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 是结构体字段的元数据。

type Mapper

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

Mapper 是一个通用的名称到结构体字段的映射器。Mapper 的行为类似于 标准库中的大多数序列化器,遵循字段标签进行名称映射,同时也提供 基本的转换函数。

func NewMapper

func NewMapper(tagName string) *Mapper

NewMapper 使用指定的 tagName 作为结构体字段标签,返回一个新的 Mapper。 如果 tagName 为空字符串,则忽略。

func NewMapperFunc

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

NewMapperFunc 返回一个新的 Mapper,可选择性地遵循字段标签和由 f 给定的 结构体字段名映射函数。标签将优先使用,但对于其他字段,映射后的名称将是 f(field.Name)。

func NewMapperTagColFunc

func NewMapperTagColFunc(tagName string, mapFunc, tagMapFunc, colMapFunc func(string) string) *Mapper

NewMapperTagColFunc 返回一个新的 Mapper,包含字段名映射器、标签值映射器 以及 SQL 列名映射器。colMapFunc 在按列名解析字段前先对列名做归一化, 适用于列大小写不一致的数据库(如 SQLite)。

func NewMapperTagFunc

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

NewMapperTagFunc 返回一个新的 Mapper,其中包含字段名称映射器和标签值映射器。 这对于像 json 这样可以在标签中包含 "name,omitempty" 等值的标签非常有用。

func (*Mapper) FieldByName

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

FieldByName 根据字段的映射名称返回 reflect.Value。 如果 v 的 Kind 不是 Struct,或者 v 不可间接寻址到结构体类型,则 panic。 如果未找到该名称,返回零值 Value。

func (*Mapper) FieldMap

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

FieldMap 返回 Mapper 对字段名到 reflect.Value 的映射。 如果 v 的 Kind 不是 Struct,或者 v 不可间接寻址到结构体类型,则 panic。

func (*Mapper) FieldsByName

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

FieldsByName 返回与名称切片对应的 Value 切片。 如果 v 的 Kind 不是 Struct,或者 v 不可间接寻址到结构体类型,则 panic。 对于每个未找到的名称,返回零值 Value。

func (*Mapper) TraversalsByName

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

TraversalsByName 返回一个 int 切片切片,表示每个映射名称的结构体遍历路径。 如果 t 不是结构体或不可间接寻址到结构体,则 panic。 对于每个未找到的名称,返回空的 int 切片。

func (*Mapper) TraversalsByNameFunc

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

TraversalsByNameFunc 遍历映射的名称,并对每个名称的索引和该名称对应的 结构体遍历路径调用 fn。如果 t 不是结构体或不可间接寻址到结构体,则 panic。 返回 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
	Leafs 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,但使用缓存的遍历路径,而不是每次重新执行 reflect 机制。

Jump to

Keyboard shortcuts

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