Это почти последняя задача моей первой (и, возможно, последней) функции приложения для ведения домашнего бюджета. На этот раз мне пришлось просто сбросить коллекцию AccountBalance в JSON.
Моей первой попыткой было перевести AccountBalance в хэш-карту, что было очень очевидно в моем мире Ruby. Но статическая типизация… Я забыл, что в Ruby не важны типы, используемые в хэш-карте, потому что она гетерогенна, чего нельзя сказать о языках со статической типизацией. К счастью, Go может легко маршалировать структуры с примитивными типами благодаря поддержке JSON в stdlib.
Я решил не использовать исходную структуру AccountBalance в качестве аргумента маршалинга, а сделать специальную структуру SerializedAccountBalance, которая будет содержать (и, следовательно, выставлять) только те поля, которые интересны интерфейсу. Конечный результат должен иметь более низкий JSON в верблюжьем регистре. Я подумал — ну, мне просто придется использовать имена в нижнем регистре в верблюжьем регистре в полях структуры, а библиотека сделает все остальное. Я ошибался.
Если вы хотите раскрыть сущность библиотеки — например, функцию или константу — она должна начинаться с большой буквы. Для меня было очевидно, что я должен сделать то же самое с сохраняемыми сущностями — моей структурой AccountBalance. Но почему-то для меня было неестественным предполагать то же самое для сериализации JSON. Я был удивлен, когда попытался маршалировать структуру all-lower-camel-cased-field и получил пустой JSON. Через несколько минут я понял, в чем проблема, поэтому последняя проблема заключалась в том, как на самом деле вернуть поля в нижнем регистре, когда структура имеет верхний регистр.
В Go есть некоторая концепция тегов, которая немного похожа на аннотацию или особый вид комментария — может быть, однажды я буду копать больше, чтобы понять всю идею. Тег можно использовать, чтобы сообщить механизму отражения некоторую метаинформацию о данном объекте — когда вы хотите сообщить ORM о каком-то ограничении, касающемся данного поля, или когда вы хотите переименовать поле во время его JSON-обработки.
Вот конечный результат:
Что дальше? Мне нужно, наконец, соединить интерфейс с бэкендом, так что немного docker + docker-compose. В июне я собираюсь переключиться на другой проект, потому что сейчас это важнее. Вероятно, я покидаю проект home_budget на несколько месяцев или даже навсегда, потому что он больше не выглядит чем-то интересным.