Tarkibga o'tish

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/http uchun 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/http middleware’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, Fiber fasthttp ustida 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.

Routing                ~0.001 ms
JSON parsing           ~0.05  ms
Database so‘rovi       ~2–20  ms
Tashqi API chaqiruvi   ~50–500 ms

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/http ustida quriladi, Fiber bundan mustasno.
  • Go 1.22 dan keyin standart kutubxona ko‘pchilik API’lar uchun yetarli.
  • Router net/http bilan 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.