omitempty bỏ field khỏi JSON khi giá trị là empty value theo định nghĩa của encoding/json: false, 0, con trỏ/interface nil, và string/array/slice/map có độ dài 0.
Danh sách này không bao gồm struct.
type Filter struct {
Page int `json:"page,omitempty"`
Query string `json:"query,omitempty"`
Range TimeRange `json:"range,omitempty"` // KHÔNG bao giờ bị bỏ
Meta *Meta `json:"meta,omitempty"` // bị bỏ khi nil
}Hệ quả hay gặp khi làm API:
- Page: 0 và "không truyền page" ra JSON giống hệt nhau. Muốn phân biệt "0" với "không có" thì dùng con trỏ (int) hoặc json.RawMessage, hoặc kiểu wrapper sql.NullInt64.
- Muốn bỏ struct rỗng thì đổi sang TimeRange, hoặc tự cài MarshalJSON.
- Slice nil cho ra null, slice rỗng []T{} cho ra [] — frontend hay lỗi ở chỗ này, nên khởi tạo make([]T, 0) trước khi trả về.
- Tag json:"-" bỏ hẳn field (dùng cho password hash); json:"-," mới là field tên đúng dấu gạch ngang.
- Field không export (chữ thường) luôn bị bỏ qua cả khi encode lẫn decode, không cần tag.
Go 1.24 thêm tùy chọn omitzero để bỏ field khi bằng zero value của kiểu, xử lý đúng cả struct và time.Time.