2025-06-15
Go Struct'ları ve JSON Tag'leri: Eksiksiz Rehber
Go'nun struct tag'leri sihir gibi görünür ama basit kurallara uyar. Onlara hakim olun ve bir daha JSON serileştirme sürprizi yaşamazsınız.
Struct Tag'leri Nedir?
Go struct tag'leri, yansıma tabanlı kütüphanelere meta veri sağlayan struct alanlarına eklenmiş dize literalleridir:
type User struct {
ID int64 `json:"id"`
FullName string `json:"full_name"`
Email string `json:"email,omitempty"`
password string // unexported — never serialized
}
encoding/json paketi, Go alan adları ile JSON anahtarları arasında eşleme yapmak için bu tag'leri okur.
omitempty Yönergesi
omitempty, alan tipi için sıfır değeri (0, "", false, nil) tutuyorsa marshaling sırasında alanı atlar:
Email string `json:"email,omitempty"`
Bu, PATCH isteklerindeki isteğe bağlı alanlar için zorunludur — kullanıcı e-posta alanına dokunmadığında "email": "" göndermek istemezsiniz.
Dikkat: omitempty, struct'larla beklendiği gibi çalışmaz. Boş bir struct {} hiçbir zaman atlanmaz. Bunun yerine bir işaretçi *Address kullanın.
- Tag'i: Alanları Açıkça Dışlama
type User struct {
Password string `json:"-"`
}
"-" tag'i, alanı hem marshaling hem de unmarshaling işlemlerinden tamamen dışlar. Yalnızca dışa aktarılmamış alanlara güvenmeyin — gelecekteki bir yeniden düzenleme yanlışlıkla birini dışa aktarabilir.
Null Olabilen Alanlar için İşaretçi Alıcılar
type User struct {
DeletedAt *time.Time `json:"deleted_at,omitempty"`
}
nil bir işaretçi JSON null'a marshal edilir. omitempty ile birleştirildiğinde, nil bir işaretçi tamamen atlanır. Bu size üç durum sağlar: mevcut, null ve yok.
Yaygın Hatalar
- Sayfalama imleçlerinde omitempty'yi unutmak — birçok API'yi bozan
"cursor": ""gönderir - Gömülü struct'larda struct tag'leri kullanmak — tag'ler gömülen struct üzerinde değil, gömülü struct üzerinde olmalıdır
- Büyük/küçük harf duyarsız unmarshaling'in her zaman çalıştığını varsaymak — çalışır, ancak daha yavaştır; performans açısından kritik yollarda kesin tag'ler kullanın
Dönüştürücümüz, toggle etkinleştirildiğinde omitempty dahil doğru JSON tag'leriyle Go struct'larını otomatik olarak üretir.