为了账号安全,请及时绑定邮箱和手机立即绑定

将结构体转换为元组切片而不进行反射

将结构体转换为元组切片而不进行反射

Go
一只名叫tom的猫 2023-07-10 16:47:45
我需要将 a 转换struct为[]Tuple. 每个元组将表示到该结构的每个叶节点的路径。例如:type inner struct {  D int}type Example struct {  A string  B *inner  C []inner}e := Example{  A: "a",  B: &inner{    D: 0,  },  C: []inner{    inner{D:0}, inner{D:1}, inner{D:2},  },}func toTuple(e *Example) []Tuple {  // this function should return:  //  [  //    Tuple{"A", "a"}  //    Tuple{"B", "D", "0"}  //    Tuple{"C", 0, "D", 0}  //    Tuple{"C", 1, "D", 1}  //    Tuple{"C", 2, "D", 2}  //  ]}有没有什么方法可以做到这一点而不必手动指定每个元组?我想避免做类似的事情:tuples = append(tuples, Tuple{"A", e.A})......for i, v := range e.C {  tuples = append(tuples, Tuple{"C", i, "D", v.D}}因为结构可能非常大,这会导致脆弱且容易出错的代码(例如,如果将新字段添加到结构中)。由于这是一个对性能敏感的应用程序,我想避免使用反射。有什么办法可以做到这一点吗?
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

你将不得不使用反射。我知道反射在性能方面表现不佳,但值得您花时间尝试它并在您注销它之前对其进行基准测试。

或者,您可以使用代码生成 - 可能仍会使用反射,但会在代码生成时输出将一起编译的 go 代码,因此在运行时不会影响性能。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信