Тип возврата динамической функции Голанга - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть приложение, разделенное на модули.Есть несколько сущностей и модуль CSV.Модуль CSV поддерживает только struct (Entity), но я хочу, чтобы модуль CSV работал с любым типом объекта.Теперь это работает так: модуль Csv получает данные из канала и строго преобразует их в EverySize struct.Как получить динамический тип возврата, чтобы он работал с любым типом сущностей, а не только с Everysize

    func prepareWrapData(data []feed.WrapExporterChannels) []everysize.EverySizeItem {
        var result []everysize.EverySizeItem
        for _, value := range data {
            result = append(result, *value.EverySizeItem)
        }
    return result
}

Ответы [ 2 ]

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

Быстрое / грязное решение: Возвратите интерфейс {}, но в конечном итоге вы обманываете компилятор, и вам не терпится проверка типов.

Лучше /Более безопасное решение: Подумайте об общих операциях, которые необходимо выполнить с типами, которые вы возвращаете, определите эти общие методы для каждого типа и сохраните эти общие методы в интерфейсе.Если вы пытаетесь вернуть несколько типов из функции, скорее всего, между ними уже должны быть какие-то общие отношения, или их можно найти с небольшой реструктуризацией.Верните этот интерфейс из функции.Таким образом, компилятор всегда сможет проверить, что вы не возвращаете что-то неожиданное (то, что не реализует эти методы).Вы можете посмотреть, как шаблон factory method реализован в Golang.(Подсказка: он возвращает интерфейсы, а не суперкласс, как это обычно делается в C ++ / Java)

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

Как отмечено в комментарии - Go не позволяет вам поддерживать универсальные типы возвращаемых данных.Таким образом, вы либо захотите вернуть тип интерфейса, которому, как вы знаете, соответствуют ваши типы сущностей, либо вы вернете пустой тип интерфейса interface{}.

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