> Какой интерфейс реализовать для JSON маршаллинга и анмаршаллинга в Go и почему методы должны иметь ресивер по указателю (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

Для JSON-маршаллинга и анмаршаллинга в Go нужно реализовать интерфейсы json.Marshaler и json.Unmarshaler. Они требуют методов MarshalJSON() ([]byte, error) и UnmarshalJSON([]byte) error соответственно.

Методы должны иметь ресивер по указателю по двум причинам:

  1. Изменение состояния: UnmarshalJSON должен модифицировать исходную структуру, а не её копию. Без указателя изменения будут потеряны.
  2. Избежание копирования: Для больших структур копирование при вызове метода может быть дорогим по памяти и производительности. Указатель передаётся эффективнее.

Пример реализации:

GO
type 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.Name
u.Age = aux.Age
return nil
}

Использование указателя гарантирует корректную работу с JSON-пакетом, особенно при передаче в функции вроде json.Marshal и json.Unmarshal, которые ожидают указатели для вызова методов интерфейса.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью