Golang 好用的反射工具库, 支持设置嵌套结构体字段, 动态函数调用等功能.

2023-09-06 13:23:36 +08:00
 atVoid

介绍

在实际业务开发中, 经常需要用到反射的能力, 比如结合远程配置动态修改结构体的字段, 这样无需发布即可实现功能变更, 再比如拓展插件的场景, 使用表驱动的方式调用一些异构的函数(无法抽象为接口)等. 这里对常用的操作进行了 getter, setter 的封装, 并增强了一些能力, 比如支持设置多层嵌套结构体的字段, 针对结构体指针自动创建等.

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

xreflect

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

主要支持如下特性:

安装和文档

安装命令 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(addFunc, 1, 2, 3)

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

核心方法

FieldX

SetX

StrcutFieldX

FuncX

Others

FAQ

FieldStrcutField 的区别是?

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

1207 次点击
所在节点    Go 编程语言
10 条回复
asmoker
2023-09-06 14:10:21 +08:00
👍🏻
atVoid
2023-09-07 17:07:26 +08:00
欢迎提出需求和建议
daiv
2023-09-07 22:29:05 +08:00
你们反射用得很多吗? 性能差不少吧
atVoid
2023-09-08 17:39:22 +08:00
@daiv 是的, golang 的反射性能确实比直接调低很多, 不过是否使用要考虑 2 个方面.
1. 场景, 是极致追求性能还是普通业务, 这其实是在性能和动态修改的灵活能力之间做取舍, 我举个例子, 在 B 端场景, 往往会更考虑灵活, 因为 B 侧业务甚至是延迟 10min 都可以接受.
2. 性能对比的尺度, 举个例子, 一个操作可能是 100ns, 用了反射之后是 500ns, 这是 5 倍, 但整体接口耗时是 200ms, 对整体的影响微乎其微, 这时可以考虑为了业务灵活性的支持引入反射.
daiv
2023-09-08 22:36:16 +08:00
@daiv 是的, 合适的地方用, 能减少非常多重复的代码, 对吧
atVoid
2023-09-10 17:14:47 +08:00
@daiv 是的, 一些场景使用反射进行动态组装可以减少重复代码, 不过我自己体会的话, 减少重复代码是一个表现不是目的, 更多的是实现一些逻辑的配置化.
daiv
2023-09-10 17:25:53 +08:00
@atVoid 丰富一下例子呗,看看你怎么用的,让我学习扩展思路
atVoid
2023-09-11 20:01:53 +08:00
@daiv README.md 的例子是吗
daiv
2023-09-11 21:26:27 +08:00
@atVoid #8 对的, 不过我在看文档和源码+Test, 基本清楚了.

readme 里面的例子 可以考虑丰富一些
atVoid
2023-10-01 14:21:17 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/971393

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX