Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在go中合并两个结构(相同类型)?_Go - Fatal编程技术网

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

在go中合并两个结构(相同类型)?,go,Go,我被困在这里了。我想写一个(通用的,如果可能的话!)函数,它将合并两个相同类型的结构——它可能不仅包含原语,还包含结构,甚至切片 由于业务层面的限制,我们无法真正使用mergo,因此我需要写下这篇文章。但是我在获得任何值得讨论的结果时遇到了一些困难——我不是在寻找一个完全有效的解决方案(如果你有代码,它肯定会有帮助),但我确实需要一些关于这个算法的指导 我会想象我想做一些事情,比如: func Merge(source CustomStruct, target CustomStruct) res

我被困在这里了。我想写一个(通用的,如果可能的话!)函数,它将合并两个相同类型的结构——它可能不仅包含原语,还包含结构,甚至切片

由于业务层面的限制,我们无法真正使用mergo,因此我需要写下这篇文章。但是我在获得任何值得讨论的结果时遇到了一些困难——我不是在寻找一个完全有效的解决方案(如果你有代码,它肯定会有帮助),但我确实需要一些关于这个算法的指导

我会想象我想做一些事情,比如:

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
}

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


总的来说,我认为你想要重新定义的是:使其通用化并不符合围棋的精神。如果您需要“合并”两个结构(这本身是一个不明确的目标,没有更具体的示例),我认为您可能应该自己编写这个函数,并使用明确的逻辑来说明哪些字段被复制到哪里

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

然后选择以下选项之一:

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

  • 如果您不能将其归结为可管理的类型数,那么仍然可以使用反射解决方案,但要复杂得多。如果您达到了这一点,请查看标准库和流行的开放源码软件包,这些软件包能够处理任何类型的示例/灵感,并意识到完成和彻底测试可能需要大量的工作/时间/思考。

    我希望您有更多的示例可供使用。但是我认为你需要结构合成,或者只是重复结构。代码重复并不像OOP语言让您相信的那样糟糕。