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

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

}

因为结构可能非常大,这会导致脆弱且容易出错的代码(例如,如果将新字段添加到结构中)。


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


一只名叫tom的猫
浏览 62回答 1
1回答

茅侃侃

你将不得不使用反射。我知道反射在性能方面表现不佳,但值得您花时间尝试它并在您注销它之前对其进行基准测试。或者,您可以使用代码生成 - 可能仍会使用反射,但会在代码生成时输出将一起编译的 go 代码,因此在运行时不会影响性能。
打开App,查看更多内容
随时随地看视频慕课网APP