在go中合并两个(相同类型的)结构?

时间:2018-09-15 22:34:13

标签: go

我有点卡在这里。我想编写一个(泛型,如果可能的话!)函数,该函数将合并两个相同类型的结构-它可能不仅包含基元,而且还包含结构,甚至是切片。

由于在业务级别上受到的限制,我们不能真正使用mergo,因此我需要编写此代码。但是我很难获得值得讨论的任何结果-我不是在寻找一个完全有效的解决方案(如果您有代码,那肯定会有所帮助),但我确实需要有关此算法的外观的一些指导。

我想我想做些类似have的事情:

func Merge(source CustomStruct, target CustomStruct) result CustomStruct{

    // Maybe some kind of son work to get my two structs to be strings?

    // Iterate the JSON, comparing each field and taking values from source and target (depending on rules), and add them to result...

    // recursion for when it contains another struct, or slice?

    // return result
}

2 个答案:

答案 0 :(得分:1)

与产品一起使用,以将用例减少到可管理的类型数量,而不是尝试编写完全通用的东西来处理任何可以想象的类型。

然后选择以下选项之一:

  1. 使用模板生成代码,该模板将按类型填充(高性能),
  2. 具有类型断言的接口(良好的性能,编写起来有些乏味,但在这里要使用好的编辑器或在此处使用带有模板的代码生成),或者
  3. 反射(性能差,复杂性更高,并且可能仍然很乏味)

如果您不能将其归结为可管理的类型数量,则仍然可以通过反射来解决,但要复杂得多。如果达到这一点,请查看能够处理任何类型的示例/灵感的标准库和流行的开源软件包,并意识到可能需要大量的工作/时间/思想来完成和彻底地测试。 / p>

答案 1 :(得分:0)

我想这里有一个关于性能的重要问题。如果性能很重要,我几乎可以保证序列化/反序列化为字符串表示不是您想要的方式。

总的来说,我会断言您想重新做些什么:使其通用化并不是Go的精神。如果您需要“合并”两个结构(本身没有一个明确的目标,没有更多具体的示例),我认为您可能应该自己编写带有明确逻辑的函数,以了解将哪些字段复制到何处。