繁体   English   中英

无需反射即可将结构转换为元组切片

[英]Converting a struct to a tuple slice without reflection

我需要将一个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}
}

因为该结构可能很大,并且会导致易碎,容易出错的代码(例如,如果将新字段添加到该结构中)。

由于这是一个对性能敏感的应用程序,因此我想避免使用反射。 有什么办法可以做到这一点?

您将必须使用反射。 我知道反射在说唱性能方面会很差,但是值得您花时间在注销之前尝试一下并进行基准测试。

或者,您可以使用代码生成-可能仍将使用反射,但是在代码生成时会发生这种情况,以输出将一起编译的go代码,因此性能含义不会在运行时出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM