[БЕЗ_ЗВУКА] Здесь давайте поговорим про json. json — это де факто стандарт передачи данных между client-side и server-side в современном вебе. Конечно, в go имеется встроенный упаковщик и распаковщик go, json, и процесс упаковки-распаковки вообще каких-либо данных в go называется маршалингом и анмаршалингом. Давайте посмотрим, как это работает. Итак, у нас есть программа. Мы для начала импортируем вообще пакет для работы с json. Есть какая-то структура пользователь: Id, Username, телефон. Есть запакованный json, в котором есть эти поля. И теперь мы хотим распаковать. Что мы делаем? Для начала мы преобразуем эту строку с json к слайсу byte, Дело в том, что распаковщик, он работает со слайсом byte, не со строками. Дальше мы создадим юзера, для начала пустого, а теперь вызовем функцию json.Unmarshal, которая принимает слайс byte, в котором должен лежать json, и переменную, куда нам нужно записать результат. И выведем. После этого я хочу изменить телефон у этой структуры и обратно запаковать ее. Для этого есть функция Marshal. То есть я вызываю функцию Marshal из пакета json и передаю туда структуру. Она мне возвращает ошибку и результат. Давайте все-таки ошибку будем явно обрабатывать, не надо учиться плохому. [ЗВУК] [ЗВУК] Вот. Ну и запустим. Я успешно распаковал структуру, то есть появился User(ID:42, Username: "rvasily" и почему-то пустой телефон. При этом, когда я запаковал структуру, там вообще нет поля «телефон». Почему так происходит? Посмотрим еще раз на нашу структуру. Поле «телефон», оно приватное, оно начинается с маленькой буквы. То есть доступ к этому полю могут иметь только те методы, те функции, которые объявлены в том же самом пакете, в котором и эта структура. А у меня пакет main. Соответственно, пакет encoding/json не может иметь к ним доступа и он не может туда ни записать данные, ни прочитать оттуда данных при запаковке. Имейте это в виду. В предыдущем видео мы видели, что я упаковываю и запаковываю поля с каким-то определенным именем. А что, если вдруг мне надо сменить это имя, при этом я не хочу менять имя структуры? Для этого тоже есть способ. В go у структур может быть какая-то метаинформация, это называется тегами структуры. Объявляется это вот так, в бэктиках после определения типа поля структуры. И тут мы можем написать: json, то есть к какому... ну какой-то префикс, к чему это относится. json. Первым полем json ожидает увидеть имя, с которым мы будем работать, то есть либо из которого ему нужно распаковывать, либо в который ему нужно записывать. И дальше — тип данных, в который он должен записать этот тип. Какие еще есть примеры? Вот поле Address. Тут идет сначала запятая, это значит, что имя как было, так и остается, я не хочу его переопределять, ну а дальше идет поле, называется omitempty, это значит, что если поле пустое, там, например, значение по умолчанию, то его не нужно писать в результат при запаковке. Минус, он же дефис, означает, что поле вообще не нужно сериализовывать и десериализовывать при json. Итак, когда мы познакомились с тэгами структур, нужно что-то записать. Я создал юзера, у него ID:42, Username, адрес, компания. И теперь запакуем. Надо посмотреть, что получилось. [ЗВУК] Итак, я запаковал нашу структуру через "user_id" : "42" и "Username" : "rvasily". Другие поля, они вообще не фигурируют в результатах. Еще раз, почему это произошло. У меня есть поле ID, оно является типом int, однако я говорю, что его нужно сериализовать, используя ключ "user_id" и сериализовать это, как строку. Username я сериализую, как есть. Address. Адрес не надо сериализовать, если он пустой. Компанию вообще не надо сериализовать никогда. Если я напишу в адресе что-то, то он должен сериализоваться. Запустим еще раз. И теперь у нас появился адрес, потому что это не пустое поле. С тегами структуры вы будете сталкиваться очень часто. Не только json имеет свои теги, но и очень много других пакетов.