GoDasturchi
Filtering & Sorting Query Parameters

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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