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
iotaGo menyediakan iota untuk enumerasi.
const (
Guest = iota // 0
Member // 1
Moderator // 2
Admin // 3
)
Masalah Utama:
Nilai
iotamudah berubah jika urutan diubah.Rentan kesalahan seperti nilai negatif atau angka tidak valid.
Tidak ada validasi otomatis.
Contoh masalah:
func CreateUser(role int) error { ... }
CreateUser(-1) // Masih bisa dijalankan!❌ 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
slugtidak 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