Framework kerakmi?
Boshqa tillardan Go’ga o‘tgan dasturchilar ko‘pincha birinchi bo‘lib "Go’da qaysi web framework ishlatiladi?" deb so‘rashadi. Python’da Django yoki FastAPI, JavaScript’da Express, PHP’da Laravel bor. Go’da ham shunday bitta asosiy framework bo‘lishi kerakdek tuyuladi.
Go hamjamiyatida bunga odatda boshqacha javob beriladi: "Avval standart kutubxonadan boshlang". Bu darsda bu javob nimaga asoslanganini va framework qachon haqiqatan foydali bo‘lishini ko‘rib chiqamiz.
Uchta daraja
Go’da HTTP servis yozishning uchta darajasi bor:
┌──────────────────────────────────────────────────────────────┐
│ Framework: Gin, Echo, Fiber │
│ o‘z Context turi, binding, validatsiya, render, guruhlar │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Router: gorilla/mux, chi │ │
│ │ kengaytirilgan routing, http.Handler bilan mos │ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ Standart kutubxona: net/http │ │ │
│ │ │ server, ServeMux, Handler, Request, ResponseWriter │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
Muhim jihat: har bir daraja pastki darajaning ustiga quriladi. Gin ham, gorilla/mux ham oxir-oqibat net/http serverida ishlaydi. Shu sababli oldingi darslarda net/http haqida o‘rganilgan barcha bilimlar har qanday tanlovda qo‘l keladi.
1. Faqat standart kutubxona
mux := http.NewServeMux()
mux.HandleFunc("GET /books/{id}", getBook)
http.ListenAndServe(":8080", mux)
Afzalliklari:
- tashqi bog‘liqlik yo‘q, ya’ni yangilash, xavfsizlik zaifliklari va litsenziya masalalari yo‘q;
- Go versiyalari o‘rtasida moslik kafolati bor: bugun yozilgan kod o‘n yildan keyin ham kompilyatsiya bo‘ladi;
- har qanday Go dasturchisi bu kodni tushunadi;
- Go 1.22 dan beri routing imkoniyatlari ko‘pchilik API’lar uchun yetarli.
Kamchiliklari:
- JSON o‘qish, validatsiya va xato javoblari uchun yordamchi funksiyalarni o‘zingiz yozasiz. Buni biz JSON bo‘limida qildik;
- marshrutlarni guruhlash va middleware zanjiri qo‘lda tashkil qilinadi.
2. Router: gorilla/mux, chi
r := mux.NewRouter()
r.HandleFunc("/books/{id:[0-9]+}", getBook).Methods("GET")
api := r.PathPrefix("/api/v1").Subrouter()
api.Use(authMiddleware)
Router faqat routing muammosini hal qiladi va boshqa hech narsaga aralashmaydi. Handlerlar oddiy func(http.ResponseWriter, *http.Request) ko‘rinishida qoladi. Middleware’lar esa standart func(http.Handler) http.Handler imzosiga ega bo‘ladi.
Afzalliklari:
- standart kutubxona bilan to‘liq mos.
net/httpuchun yozilgan har qanday middleware ishlaydi; - guruhlash, subrouter’lar va regex kabi qo‘shimcha imkoniyatlar;
- routerni almashtirish nisbatan oson, chunki handlerlar o‘zgarmaydi.
Kamchiliklari:
- bitta qo‘shimcha bog‘liqlik;
- JSON va validatsiya masalalari baribir sizning zimmangizda qoladi.
3. Framework: Gin, Echo, Fiber
r := gin.Default()
r.GET("/books/:id", func(c *gin.Context) {
var q Query
if err := c.ShouldBindQuery(&q); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, book)
})
Framework tayyor yechimlar to‘plamini beradi: binding, validatsiya, JSON render, guruhlar, recovery va logger middleware’lari.
Afzalliklari:
- tez boshlash, kam yordamchi kod;
- ko‘p uchraydigan vazifalar uchun tayyor yechimlar;
- katta hamjamiyat va ko‘plab tayyor middleware’lar.
Kamchiliklari:
- o‘z handler imzosi. Gin handleri
func(*gin.Context)ko‘rinishida bo‘ladi. Kod framework’ga bog‘lanib qoladi va boshqasiga o‘tish qimmatga tushadi; - standart
net/httpmiddleware’larini ulash uchun adapter kerak bo‘ladi; - ichki "sehr"ni tushunish qiyinroq: xatolar qayerda va qanday qayta ishlanishini o‘rganish kerak;
- ba’zi framework’lar
net/httpga umuman asoslanmagan. Masalan, Fiberfasthttpustida qurilgan va standart ekotizim bilan moslikni qisman yo‘qotadi.
Tezlik haqida
Framework’lar ko‘pincha "falon marta tezroq" deb reklama qilinadi. Real API’da so‘rov vaqtining asosiy qismi routing’ga emas, database so‘rovlari, tarmoq va JSON bilan ishlashga ketadi.
Routerlar orasidagi mikrosekundlik farq umumiy javob vaqtida deyarli sezilmaydi. Tanlovni tezlik emas, qulaylik, moslik va jamoa tajribasi belgilashi kerak. Real ishlash tezligi haqida Gin: Performance darsida gaplashamiz.
Qanday tanlash kerak?
| Holat | Tavsiya |
|---|---|
| Go’ni o‘rganyapsiz | Standart kutubxona. Poydevorni tushunish muhim |
| Kichik yoki o‘rta API, ozgina bog‘liqlik muhim | Standart kutubxona |
| Murakkab routing: regex, host, ko‘p guruhlar | gorilla/mux yoki chi |
Mavjud loyiha gorilla/mux bilan yozilgan |
gorilla/muxda davom eting |
| Jamoa framework’ga o‘rgangan, tez natija kerak | Gin yoki Echo |
| Loyiha ko‘p yillar davomida qo‘llab-quvvatlanadi | net/http bilan mos yechim: standart kutubxona yoki router |
Asosiy qoida
Qaysi yo‘lni tanlasangiz ham, biznes mantiqini framework’dan ajrating. Clean architecture darsidagi kabi service va repository qatlamlari framework haqida hech narsa bilmasligi kerak. Shunda framework faqat HTTP qatlamida qoladi va uni almashtirish kerak bo‘lsa, faqat handlerlar qayta yoziladi.
Handler (gin / mux / net/http) ← framework faqat shu yerda
↓
Service ← oddiy Go kodi
↓
Repository ← oddiy Go kodi
Xulosa
- Go’da HTTP servis yozishning uch darajasi bor: standart kutubxona, router va framework. Ularning barchasi
net/httpustida quriladi, Fiber bundan mustasno. - Go 1.22 dan keyin standart kutubxona ko‘pchilik API’lar uchun yetarli.
- Router
net/httpbilan to‘liq mos holda qo‘shimcha routing imkoniyatlarini beradi. - Framework tez boshlash imkonini beradi, lekin kodni o‘z turlariga bog‘lab qo‘yadi.
- Routing tezligi odatda hal qiluvchi omil emas.
- Biznes mantiqini framework’dan ajrating.
Keyingi darsda gorilla/mux bilan router yaratib, kitoblar API’sini qayta yozamiz.