Filtering & Sorting Query Parameters
Filtrlash va saralash (query parametrlar)
Kutubxona katalogida "faqat FANTASTIKA janridagi kitoblarni ko'rsat" (filtrlash) va "ENG ARZONIDAN boshlab tartibla" (saralash) — ikkita MUSTAQIL so'rov. API'da ham bular ODATDA GET /books?author=...&sort=... kabi QUERY PARAMETRLAR orqali beriladi: mijoz KERAKLI qismini SO'RAYDI, server esa BUTUN katalogni emas, FAQAT so'ralganini qaytaradi.
package main
import (
"fmt"
"sort"
"strings"
)
type Book struct {
Title string
Author string
Price float64
}
func filterByAuthor(books []*Book, author string) []*Book {
if author == "" {
return books
}
var result []*Book
for _, b := range books {
if b.Author == author {
result = append(result, b)
}
}
return result
}
// applySort — sortBy "price", "-price", "title" yoki "-title" bo'lishi mumkin ("-" = kamayish tartibi)
func applySort(books []*Book, sortBy string) []*Book {
desc := strings.HasPrefix(sortBy, "-")
field := strings.TrimPrefix(sortBy, "-")
sorted := make([]*Book, len(books))
copy(sorted, books)
sort.Slice(sorted, func(i, j int) bool {
switch field {
case "price":
if desc {
return sorted[i].Price > sorted[j].Price
}
return sorted[i].Price < sorted[j].Price
case "title":
if desc {
return sorted[i].Title > sorted[j].Title
}
return sorted[i].Title < sorted[j].Title
default:
return false
}
})
return sorted
}
func main() {
books := []*Book{
{Title: "Go bilan tanishuv", Author: "A. Karimov", Price: 45000},
{Title: "Konkurentlik asoslari", Author: "D. Yusupova", Price: 52000},
{Title: "Generiklar chuqur", Author: "A. Karimov", Price: 38000},
}
filtered := filterByAuthor(books, "A. Karimov")
sorted := applySort(filtered, "-price")
for _, b := range sorted {
fmt.Println(b.Title, b.Price)
}
}strings.HasPrefix(sortBy, "-") — "minus" belgisini KAMAYISH tartibi (descending) SIFATIDA talqin qilish — ko'plab HAQIQIY API'larda (masalan GitHub, Stripe) ishlatiladigan ODATIY konvensiya: sort=price — o'sish, sort=-price — kamayish. make([]*Book, len(books)) + copy — ASL books slice'ini O'ZGARTIRMASDAN, YANGI nusxa ustida saralaydi ("Slices" darsidagi "copy semantikasi"ni eslang) — bu MUHIM, chunki boshqa so'rov ASL tartibga muhtoj bo'lishi mumkin.
filterByAuthor va applySort — BIR-BIRIDAN MUSTAQIL, KICHIK funksiyalar: avval FILTRLANADI, keyin natija SARALANADI. Bu tartib (filter -> sort) muhim: avval kamroq elementni saralash, KO'PROQ elementni saralashdan TEZROQ.
>_ Exercise
Filtrlash va saralashni HAQIQIY HTTP so'rov query parametrlaridan o'qiydigan qilib ulang.
- •"GET /books" handlerini yozing: r.URL.Query() orqali "author" va "sort" parametrlarini o'qing
- •avval filterByAuthor, so'ng applySort qo'llang, natijani JSON massiv qilib qaytaring
- •"/books?author=A.+Karimov&sort=title" so'rovi yuborib (bo'sh so'rovda applySort hech narsa qilmasin — sortBy == "" tekshiruvini qo'shing), javob tanasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Filtrlash va saralash — HAR IKKISI ham query parametrlar orqali BOSHQARILADI, bir-biridan MUSTAQIL kichik funksiyalar sifatida amalga oshiriladi va ODATDA avval filtrlanadi, KEYIN saralanadi.
NEXT UP
Partial Updates with PATCH
$ go run main.go
Kodingizni ishga tushiring