Хобрук: Ваш путь к мастерству в программировании

Как создать универсальную функцию для демаршалирования всех типов?

У меня есть функция ниже, и я хотел бы сделать ее общей:

func genericUnmarshalForType1(file string) Type1 {

  raw, err := ioutil.ReadFile(file)

  if err != nil {
      fmt.Println(err.Error())
      os.Exit(1)
  }

  var type1 Type1

  json.Unmarshal(raw, &type1)
}

Я хотел бы создать функцию, которая принимает Type1 или Type2 без необходимости создавать функцию для каждого типа. Как я могу это сделать?

23.12.2015

  • Плохие новости. Вы не можете писать дженерики в Go. Хотя вы потенциально можете объединить логику в одну функцию, вам все равно потребуется код, специфичный для каждого типа, который вы хотите демаршалировать. 23.12.2015
  • json.Umarshal уже имеет общие типы по умолчанию, которые он заполняет, если вы их используете, или пустой интерфейс {}. 23.12.2015

Ответы:


1

Сделайте это так же, как это делает json.Unmarshal:

func genericUnmarshal(file string, v interface{}) {
    // File emulation.
    raw := []byte(`{"a":42,"b":"foo"}`)
    json.Unmarshal(raw, v)
}

Детская площадка: http://play.golang.org/p/iO-cbK50BE.

Вы можете улучшить эту функцию, фактически возвращая любые обнаруженные ошибки.

23.12.2015

2

Go не поддерживает дженерики, но вы можете написать что-то вроде этого:

func genericUnmarshalForType1(file string) interface{} {

    raw, err := ioutil.ReadFile(file)

    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    var x interface{}
    if err = json.NewDecoder(raw).Decode(x); err != nil {
        return nil
    }

    return x
}

func main() {
    x := genericUnmarshalForType1("filename.json");

    var t1 Type1
    var t2 Type2

    switch t := x.(type) {
    case Type1:
        t1 = t
    case Type2:
        t2 = t
    }
}

Также рекомендую прочитать http://attilaolah.eu/2013/11/29/json-decoding-in-go/ о Unmarshal использовании и типах данных.

23.12.2015
Новые материалы

Управление DOM для чайников вроде меня
Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

Что такое структура данных?
Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

мои январские чтения по программированию
Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

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

Введение в машинное обучение для обнаружения аномалий (часть 1)
Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

Начало работы с Pulumi в Digital Ocean
Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..