关于go:Golang-简单易用的反射工具库-支持设置嵌套结构体字段-函数调用-etc

3次阅读

共计 3283 个字符,预计需要花费 9 分钟才能阅读完成。

介绍

在理论业务开发中, 常常须要用到反射的能力, 比方联合近程配置动静批改构造体的字段, 这样无需公布即可实现性能变更, 再比方拓展插件的场景, 应用表驱动的形式调用一些异构的函数 (无奈形象为接口) 等.
这里对罕用的操作进行了 getter, setter 的封装, 并加强了一些能力, 比方反对设置多层嵌套构造体的字段, 针对构造体指针主动创立等.

地址: https://github.com/morrisxyang/xreflect
中文文档: https://github.com/morrisxyang/xreflect/blob/main/README_CN.md
如果感觉有用欢送 Star 和 PR, 有问题间接提 Issue

xreflect

一个简略的, 易用的反射工具库.

次要反对如下个性:

  • 设置构造体字段值, 反对通过门路比方 A.B.C 设置 嵌套构造体 字段的值
  • 获取构造体字段的值, 类型, Tag 等.
  • 遍历构造体所有字段, 反对 select 模式和 range 模式, 如果应用 深度遍历 办法比方 FieldsDeep 将遍历所有嵌套构造.
  • 函数调用, 办法调用, 反对可变参数.
  • 新建实例, 判断接口实现等等.

装置和文档

装置命令 go get github.com/morrisxyang/xreflect.

文档见 https://pkg.go.dev/github.com/morrisxyang/xreflect

疾速开始

设置嵌套构造体字段值

person := &Person{
    Name: "John",
    Age:  20,
    Country: Country{
        ID:   0,
        Name: "Perk",
    },
}

_ = SetEmbedField(person, "Country.ID", 1)

// Perk's ID: 1 
fmt.Printf("Perk's ID: %d \n", person.Country.ID)

调用函数

var addFunc = func(nums ...int) int {
        var sum int
        for _, num := range nums {sum += num}
        return sum
}

res, _ := CallFunc(addFunc1, 1, 2, 3)

// 6
fmt.Println(res[0].Interface())

外围办法

FieldX

  • func Field(obj interface{}, fieldName string) (reflect.Value, error)
  • func FieldValue(obj interface{}, fieldName string) (interface{}, error)
  • func EmbedField(obj interface{}, fieldPath string) (reflect.Value, error)
  • func EmbedFieldValue(obj interface{}, fieldPath string) (interface{}, error)
  • [func Fields(obj interface{}) (map[string]reflect.Value, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#Fields)
  • [func FieldsDeep(obj interface{}) (map[string]reflect.Value, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#FieldsDeep)
  • func RangeFields(obj interface{}, f func(string, reflect.StructField, reflect.Value) bool) error
  • [func SelectFields(obj interface{}, f func(string, reflect.StructField, reflect.Value) bool) (map[string]reflect.Value, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#SelectFields)
  • etc.

SetX

  • func SetEmbedField(obj interface{}, fieldPath string, fieldValue interface{}) error
  • func SetField(obj interface{}, fieldName string, fieldValue interface{}) error
  • func SetPrivateField(obj interface{}, fieldName string, fieldValue interface{}) error
  • etc.

StrcutFieldX

  • func StructField(obj interface{}, fieldName string) (reflect.StructField, error)
  • func StructFieldTagValue(obj interface{}, fieldName, tagKey string) (string, error)
  • func EmbedStructField(obj interface{}, fieldPath string) (reflect.StructField, error)
  • [func StructFields(obj interface{}) ([]reflect.StructField, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#StructFields)
  • [func StructFieldsFlatten(obj interface{}) ([]reflect.StructField, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#StructFiel…)
  • [func SelectStructFields(obj interface{}, f func(int, reflect.StructField) bool) ([]reflect.StructField, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#SelectStru…)
  • func RangeStructFields(obj interface{}, f func(int, reflect.StructField) bool) error
  • etc.

FuncX

  • [func CallFunc(fn interface{}, args …interface{}) ([]reflect.Value, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#CallFunc)
  • [func CallMethod(obj interface{}, method string, params …interface{}) ([]reflect.Value, error)](https://pkg.go.dev/github.com/morrisxyang/xreflect#CallMethod)
  • etc.

Others

  • func NewInstance(obj interface{}) interface{}
  • func Type(obj interface{}) reflect.Type
  • func TypePenetrateElem(obj interface{}) reflect.Type
  • func Value(obj interface{}) reflect.Value
  • func ValuePenetrateElem(obj interface{}) reflect.Value
  • etc.

FAQ

FieldStrcutField 的区别是?

Field 返回 reflect.Value, StrcutField 返回 reflect.StrcutField.

正文完
 0