共计 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
Field
和 StrcutField
的区别是?
Field
返回 reflect.Value, StrcutField
返回 reflect.StrcutField.
正文完