Go Project
Berikut adalah best practice Go Project yang sudah diperbarui dengan poin-poin tambahan dan elaborasi lebih dalam:
1. Logging & Observability✅ Slog & MultiwriterGunakan slog sebagai structured logger bawaan Go 1.21 ke atas.
Manfaatkan multiwriter untuk menulis log ke beberapa output sekaligus, misalnya file dan stdout:
Pastikan log mencatat trace ID dan context untuk debugging lebih mudah.
✅ Log File RotationGunakan lumberjack untuk merotasi log dan menghindari file log membengkak:
2. Routing & API Framework✅ Go ChiGunakan chi untuk router yang ringan dan fleksibel dibandingkan
net/http
.Support middleware, grouping routes, dan parameterized routing:
3. Database & Query Handling✅ PostgresGunakan pgx daripada database/sql untuk Postgres karena lebih cepat dan efisien.
Pastikan connection pooling optimal dengan pgxpool.
✅ Raw Query (Instead of ORM like GORM)Hindari ORM seperti GORM untuk query kompleks agar lebih optimal.
Gunakan pgx.NamedArgs atau query builder ringan seperti squirrel jika diperlukan.
✅ Transaction HandlingGunakan manual transaction handling dengan
BEGIN
,COMMIT
,ROLLBACK
.Terapkan unit of work pattern untuk menghindari transaksi yang tidak terkelola dengan baik.
4. Configuration Management✅ Environment-Based ConfigGunakan Viper atau envconfig untuk mengelola konfigurasi dari environment variables.
Hindari hardcoded config di dalam kode.
5. Dependency Injection (DI)✅ Wire atau FxGunakan Google Wire atau Fx untuk dependency injection agar kode lebih terstruktur.
Jika ingin lebih ringan, gunakan manual DI dengan constructor functions.
6. Error Handling yang Konsisten✅ Sentinel Errors & WrappingGunakan sentinel errors untuk kode error yang bisa dikenali.
Gunakan fmt.Errorf atau errors.Join untuk wrapping error dengan konteks tambahan.
7. Context Management✅ Timeout & DeadlineSelalu gunakan context.Context untuk request dan database call.
Atur timeout pada setiap request untuk menghindari goroutine leaks.
8. Security & Best Practices✅ Input Validation & HashingGunakan bcrypt untuk hashing password.
Validasi input dengan go-playground/validator.
✅ Rate Limiting & Secrets ManagementGunakan golang.org/x/time/rate atau Redis untuk membatasi request.
Simpan credential di secrets manager (bukan di kode).
9. Efficient Goroutine & Worker Pool Management✅ Worker Pool & sync.PoolGunakan worker pool untuk task concurrent.
Gunakan sync.Pool untuk mengelola objek yang sering dialokasikan ulang.
10. Graceful Shutdown✅ Handling SIGINT/SIGTERMPastikan aplikasi menangani SIGINT/SIGTERM untuk shutdown yang bersih.
Tutup semua koneksi database, cache, dan WebSocket saat aplikasi berhenti.
11. Modul & Package Organization✅ Domain-Driven Design (DDD) & Separation of ConcernsPisahkan kode ke dalam layer seperti repository, service, handler agar lebih maintainable.
12. CI/CD & Deployment✅ GitHub Actions / GitLab CIGunakan CI/CD pipeline untuk otomatisasi testing dan deployment.
Pastikan ada health check endpoint untuk monitoring di production 🔥
Last updated