Слияние двух структур (одного типа) в го? - PullRequest
0 голосов
/ 16 сентября 2018

Я застрял здесь.Я хочу написать (универсальную, если возможно!) Функцию, которая объединит две структуры одного типа, которые также могут содержать не только примитивы, но и структуры и даже фрагменты.

Из-за ограничений, которыеМы не можем использовать 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
}

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Работайте с продуктом, чтобы уменьшить количество вариантов использования до управляемого количества типов, а не пытаться написать что-то полностью универсальное, способное обработать любой мыслимый тип.

Затем выберите один из:

  1. Генерация кода с шаблонами, которые будут заполняться для каждого типа (высокая производительность),
  2. Интерфейсы с утверждениями типа (хорошая производительность, несколько утомительно писать, но использовать хороший редактор или использовать генерацию кодас шаблонами и здесь), или
  3. Отражение (низкая производительность, большая сложность и, возможно, все еще утомительно)

Если вы не можете получить доступ к управляемому числу типоврешение все еще возможно с отражением, но гораздо более сложное.Если вы достигнете этой точки, посмотрите на стандартную библиотеку и популярные пакеты с открытым исходным кодом, которые способны обрабатывать любой тип для примеров / вдохновения, и помните, что для завершения и тщательного тестирования, скорее всего, потребуется много работы / времени / мысли.

0 голосов
/ 16 сентября 2018

Я думаю, здесь есть важный вопрос о производительности. Если производительность имеет значение, я могу в значительной степени гарантировать, что сериализация / десериализация в строковое представление - это не то, что вам нужно.

В общем, я бы утверждал, что то, что вы хотите сделать заново: сделать его родовым, не в духе Го. Если вам нужно «объединить» две структуры (сама по себе неясная цель без более конкретных примеров), я думаю, вам, вероятно, следует написать эту функцию самостоятельно с явной логикой, в которой поля копируются, куда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...