Butuh framework, atau tidak?
Di ekosistem lain, framework adalah titik awal. Di Go, pustaka standar sudah menutup sebagian besar kebutuhan, sehingga pertanyaannya berbalik: apa yang belum ada, dan apakah aku memerlukannya?
Intisari
- Sejak Go 1.22,
ServeMuxmengerti metode dan parameter jalur β alasan terbesar memakai router pihak ketiga hilang. - Semua framework Go berdiri di atas
http.Handler; berpindah bukan penulisan ulang. - Yang belum ada di pustaka standar: grup middleware yang ringkas, pengikatan & validasi, dan dokumentasi OpenAPI.
- Perbedaan performa antar framework hampir selalu tidak relevan β kuerimu jauh lebih mahal daripada routernya.
- Rekomendasi:
net/http+ chi. Standar untuk semuanya, chi untuk kenyamanan routing.
Apa yang berubah di Go 1.22
// Sebelum Go 1.22 β inilah alasan orang memakai router pihak ketiga
mux.HandleFunc("/produk/", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "", http.StatusMethodNotAllowed)
return
}
id := strings.TrimPrefix(r.URL.Path, "/produk/")
...
})
// Sejak Go 1.22
mux.HandleFunc("GET /produk/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
...
})
Yang masih belum ada di pustaka standar
| Fitur | net/http | Framework |
|---|---|---|
| Routing metode + parameter | β | β |
| Middleware | β manual | β dengan sintaks grup |
| Grup rute bersarang | β οΈ lewat subrouter + StripPrefix | β ringkas |
| Bind + validasi body | β tulis sendiri | β bawaan |
| Penanganan error terpusat | β | β (Echo, Fiber) |
| Daftar rute untuk debugging | β | β
(chi Walk) |
| Dokumentasi OpenAPI | β | β οΈ lewat generator terpisah |
| Kompresi, CORS, request ID | β tulis sendiri (~20 baris masing-masing) | β paket middleware |
Peta pilihan
net/http | chi | Echo | Gin | Fiber | |
|---|---|---|---|---|---|
Kompatibel http.Handler | β | β | Adaptor | Adaptor | β |
| Dependensi | Nol | Nol tambahan | Beberapa | Beberapa | fasthttp |
| Bind + validasi | β | β | β | β | β |
| Konteks permintaan | *http.Request | *http.Request | echo.Context | *gin.Context | *fiber.Ctx |
| HTTP/2 | β | β | β | β | β |
| Cocok untuk | Layanan kecil | Sebagian besar | API menengahβbesar | Tim yang sudah pakai | Proksi/gateway throughput tinggi |
Baris pertama tabel adalah yang paling penting. chi memakai http.Handler yang sama
persis, jadi setiap middleware, setiap paket pihak ketiga, dan setiap contoh kode dari dokumentasi resmi
Go langsung bekerja. Echo dan Gin memakai tipe konteks sendiri (dengan adaptor tersedia), dan Fiber
memakai tumpukan HTTP yang sama sekali berbeda.
Soal benchmark
Anggaran waktu satu permintaan nyata:
Routing 0,001 ms β yang dibandingkan benchmark framework
Middleware (log, auth) 0,05 ms
Kueri database 8 ms β 99% waktumu ada di sini
Serialisasi JSON 0,3 ms
Jaringan ke klien 20 ms
ββββββββββββββββββββββββββββββββββββ
Total ~28 ms
Framework yang "tiga kali lebih cepat" mempercepat 0,001 ms jadi 0,0003 ms. Itu perbedaan 0,002% pada permintaan nyata. Benchmark "juta permintaan per detik" mengukur handler yang mengembalikan string statis β beban yang tidak ada di aplikasi mana pun. Pilih berdasarkan bentuk kode dan kompatibilitas, bukan angka itu.
Rekomendasi berdasarkan situasi
| Situasi | Pilihan | Alasan |
|---|---|---|
| Belajar Go | net/http | Semua yang kamu pelajari tetap berlaku di mana pun |
| Layanan kecil, < 20 rute | net/http | Tidak ada yang kurang |
| Aplikasi web umum | chi | Grup middleware ringkas, tetap http.Handler |
| API besar dengan banyak validasi | Echo | Bind + validasi + error terpusat mengurangi banyak kode |
| Tim sudah memakai Gin | Gin | Konsistensi lebih berharga daripada migrasi |
| Gateway/proksi throughput sangat tinggi | Fiber | Ukur dulu; harganya keluar dari ekosistem net/http |
Kalau tetap memakai pustaka standar
// Yang perlu kamu tulis sendiri β semuanya pendek, dan semuanya
// sudah dibahas di Fase 3:
// Pulihkan() pemulih panic + stack trace ~25 baris
// RequestID() ID per permintaan ~15 baris
// Log() log akses terstruktur ~30 baris
// BatasWaktu() timeout context ~10 baris
// CORS() header lintas asal ~25 baris
// Kompres() gzip untuk respons besar ~30 baris
// HeaderKeamanan() CSP dan kawan-kawan (Fase 6) ~20 baris
//
// Sekitar 150 baris yang ditulis sekali, dimiliki sendiri, dan tidak
// pernah berubah karena rilis mayor pustaka orang lain.
Jangan mencampur dua framework. Memakai router chi dengan konteks Gin, atau memasang middleware Echo di server Fiber, menghasilkan lapisan adaptor yang membingungkan dan bug yang sulit ditelusuri. Pilih satu tumpukan per binari, dan tetap di situ.
Latihan: tulis API CRUD kecil tiga kali β dengan net/http saja, dengan chi, dan
dengan Echo. Hitung baris kodenya, dan lebih penting: perhatikan berapa banyak dari pengetahuanmu yang
terbawa antar ketiganya. Itu yang menentukan biaya sesungguhnya dari sebuah pilihan framework.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.