Go Series: Safer Enum
Enum di Go
Go tidak mendukung enums secara bawaan, tetapi ada cara untuk menirunya. Banyak solusi yang terlihat jelas ternyata kurang ideal. Berikut beberapa ide untuk membuat enums lebih aman secara desain.
iota
iota
Go menyediakan iota
untuk enumerasi.
Masalah Utama:
Nilai
iota
mudah berubah jika urutan diubah.Rentan kesalahan seperti nilai negatif atau angka tidak valid.
Tidak ada validasi otomatis.
Contoh masalah:
❌ Anti-pattern: Enums Integer
Hindari penggunaan iota
untuk enums yang bukan angka berurutan atau flags.
Sentinel Values
Tambahkan nilai eksplisit untuk zero-value.
✅ Taktik: Sentinel Eksplisit
Gunakan variabel khusus (seperti Unknown
) untuk merepresentasikan nilai default yang tidak valid.
Slugs (String Enums)
Gunakan string untuk enums agar lebih deskriptif.
Keuntungan:
Nilai mudah dipahami di log, API, atau database.
Contoh:
{"error": "user-not-found"}
lebih jelas daripada{"error": 404}
.
✅ Taktik: Slugs Gunakan string dengan format konsisten (camelCase, snake_case, dll) untuk memudahkan parsing.
Enums Berbasis Struct
Enkapsulasi enums dalam struct untuk keamanan ekstra.
Keuntungan:
Tidak bisa membuat nilai invalid dari luar package (karena field
slug
tidak diekspor).Validasi otomatis saat pembuatan objek.
✅ Taktik: Struct-based Enums Gunakan struct untuk menjamin validitas nilai enum saat kompilasi.
Perbandingan Solusi
iota
Rendah
❌
❌
Sentinel Values
Sedang
❌
✅ (Parsial)
Slugs (String)
Sedang
✅
❌
Struct-based
Tinggi
✅
✅
Kesimpulan
Hindari enums integer kecuali untuk urutan atau flags.
Gunakan string (
slugs
) untuk enums yang perlu deskriptif.Pertimbangkan struct-based enums untuk logika bisnis kritis yang membutuhkan validasi ketat.
Dengan pendekatan ini, kode Anda menjadi lebih aman, mudah dipelihara, dan kurang rentan terhadap kesalahan logika.
Last updated