← ко всем постам
2026-07-20 · #web

JSON в Go: теги, опущение полей и подводные камни

Маршалинг JSON в Go завязан на теги структурных полей. Без тега имя поля в JSON совпадёт с именем в Go — с большой буквы, что редко нужно.

type User struct {
    Name  string `json:"name"`
    Email string `json:"email,omitempty"`
    id    int    // приватное — не попадёт в JSON
}

omitempty и его сюрпризы

Опция omitempty опускает поле, если оно равно нулевому значению. Но «ноль» для чисел — это 0, а для булева — false. То есть валидное значение false тоже пропадёт из вывода.

Если нужно различать «не задано» и «задано в ноль» — используйте указатели: *bool вместо bool. Тогда nil — «не задано», а &false — честный false.