> Какой интерфейс реализовать для JSON маршаллинга и анмаршаллинга в Go и почему методы должны иметь ресивер по указателю (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Лига Цифровой Экономики
Стек: Go
> Пример ответа
Для JSON-маршаллинга и анмаршаллинга в Go нужно реализовать интерфейсы json.Marshaler и json.Unmarshaler. Они требуют методов MarshalJSON() ([]byte, error) и UnmarshalJSON([]byte) error соответственно.
Методы должны иметь ресивер по указателю по двум причинам:
- Изменение состояния:
UnmarshalJSONдолжен модифицировать исходную структуру, а не её копию. Без указателя изменения будут потеряны. - Избежание копирования: Для больших структур копирование при вызове метода может быть дорогим по памяти и производительности. Указатель передаётся эффективнее.
Пример реализации:
GOtype User struct {Name string `json:"name"`Age int `json:"age"`}func (u *User) MarshalJSON() ([]byte, error) {return json.Marshal(struct {Name string `json:"name"`Age int `json:"age"`}{Name: u.Name,Age: u.Age,})}func (u *User) UnmarshalJSON(data []byte) error {var aux struct {Name string `json:"name"`Age int `json:"age"`}if err := json.Unmarshal(data, &aux); err != nil {return err}u.Name = aux.Nameu.Age = aux.Agereturn nil}
Использование указателя гарантирует корректную работу с JSON-пакетом, особенно при передаче в функции вроде json.Marshal и json.Unmarshal, которые ожидают указатели для вызова методов интерфейса.
> Похожие задачи по Go
> Похожие задачи по backend
Вычистит ли сборщик мусора объекты, если они ссылаются друг на друга, но не имеют ссылок из корня
Как запустить две задачи параллельно и дождаться их результата
Что такое embedding
Что такое protobuf и как он используется в gRPC
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью