Tarkibga o'tish

6. Generics — umumiy dasturlash

Go 1.18 dan boshlab funksiya va turlar tur parametrlariga ega bo'lishi mumkin. Masalalarda any, comparable va cmp.Ordered cheklovlaridan hamda o'zingiz yozgan cheklovlardan foydalaning.

Umumiy funksiyalar

1. Max[T cmp.Ordered](a, b T) T funksiyasini yozing va uni int, float64 va string bilan chaqiring.
Misol: Max(3, 7) → 7; Max(2.5, 1.5) → 2.5; Max("a", "b") → b

2. Sum[T Number](s []T) T funksiyasini yozing; Number cheklovini ~int | ~int64 | ~float64 ko'rinishida o'zingiz e'lon qiling. type Money int turi bilan ham ishlashini tekshiring.
Misol: Sum([]int{1, 2, 3}) → 6; Sum([]float64{1.5, 2.5}) → 4; Sum([]Money{10, 20}) → 30

3. Map[T, U any](s []T, f func(T) U) []U, Filter[T any](s []T, f func(T) bool) []T va Reduce[T, A any](s []T, init A, f func(A, T) A) A funksiyalarini yozing.
Misol: [1 2 3]: Map(x*2) → [2 4 6]; Filter(juft) → [2]; Reduce(0, +) → 6

4. Contains[T comparable](s []T, v T) bool va IndexOf funksiyalarini yozing. Nega comparable o'rniga any ishlatib bo'lmasligini ko'rsating.
Misol: Contains([]int{1, 2, 3}, 2) → true; IndexOf(..., 3) → 2; any cheklovi bilan == kompilyatsiya xatosi beradi

5. Keys[K comparable, V any](m map[K]V) []K va Values funksiyalarini yozing; kalitlar saralangan holda qaytishi uchun K cmp.Ordered versiyasini ham yozing.
Misol: Keys(map[string]int{"b": 2, "a": 1}) → [a b] (saralangan versiyada)

6. GroupBy[T any, K comparable](s []T, key func(T) K) map[K][]T funksiyasini yozing va talabalarni guruh bo'yicha guruhlashda ishlating.
Misol: GroupBy(talabalar, guruh) → map[G1:[Ali Sevara] G2:[Vali]]

7. Uniq[T comparable](s []T) []T funksiyasini yozing: takrorlanuvchilarni olib tashlab, birinchi uchrash tartibini saqlasin.
Misol: Uniq([]int{3, 1, 3, 2, 1}) → [3 1 2]

8. Zip[A, B any](a []A, b []B) []Pair[A, B] funksiyasini va umumiy Pair[A, B] turini yozing.
Misol: Zip([]int{1, 2, 3}, []string{"a", "b"}) → [{1 a} {2 b}]

Umumiy turlar

9. Umumiy stek Stack[T any] ni Push, Pop() (T, bool), Peek, Len metodlari bilan yozing. Bo'sh stekdan Pop qilinganda nol qiymat qaytarishni (var zero T) ko'rsating.
Misol: Push(1), Push(2), Pop() → 2 true; bo'sh stekda Pop() → 0 false

10. Umumiy navbat Queue[T any] ni halqali bufer (ring buffer) asosida yozing.
Misol: sig'im 3: 1 2 3 qo'shilib, Dequeue() → 1, 4 qo'shilsa → [2 3 4]

11. Umumiy to'plam Set[T comparable] ni Add, Has, Remove, Union, Intersect metodlari bilan yozing.
Misol: {1 2} va {2 3} → Union {1 2 3}, Intersect {2}

12. Umumiy bog'langan ro'yxat List[T any] ni yozing va unga All() iter.Seq[T] metodini qo'shib, for v := range list.All() bilan aylanib chiqing.
Misol: 1 → 2 → 3: for v := range list.All() → 1 2 3

13. Umumiy ikkilik qidiruv daraxti BST[T cmp.Ordered] ni Insert, Contains va tartiblangan aylanib chiqish metodlari bilan yozing.
Misol: Insert(5), Insert(3), Insert(8) → tartiblangan aylanib chiqish 3 5 8; Contains(3) → true

14. Ustuvorlikli navbat PriorityQueue[T any] ni solishtirish funksiyasi (less func(a, b T) bool) bilan binar uyum (heap) asosida yozing.
Misol: less(a, b) = a < b: Push 3 1 2 → Pop ketma-ketligi 1 2 3

15. Umumiy Cache[K comparable, V any] turini yozing: Get, Set va har bir yozuv uchun yashash muddati (TTL) bilan.
Misol: TTL 1s: Set("a", 1), darhol Get("a") → 1 true; 2s dan keyin → 0 false

Cheklovlar va chegaralar

16. Stringer cheklovi bilan Join[T fmt.Stringer](s []T, sep string) string funksiyasini yozing va o'zingizning turlaringiz bilan sinab ko'ring.
Misol: Join([]Weekday{1, 2}, ", ") → Dushanba, Seshanba

17. ~ belgisining ma'nosini ko'rsating: int cheklovi va ~int cheklovini type Age int turi bilan sinab, farqini tushuntiring.
Misol: type Age int; T int bilan F(Age(5)) — kompilyatsiya xatosi; T ~int bilan ishlaydi

18. Tur parametrini chaqiruvda aniq ko'rsatish kerak bo'lgan holatni ko'rsating: Zero[T any]() T funksiyasini chaqirishda Zero[int]() yozish nega shart.
Misol: Zero[int]() → 0; Zero[string]() → ""; Zero() — kompilyatsiya xatosi (tur chiqarib bo'lmaydi)

19. Bir xil vazifani generics bilan va any + type switch bilan yozing (masalan, slice yig'indisi). Tur xavfsizligi va qulaylik jihatidan solishtiring.
Misol: Sum([]int{1, 2, 3}) → 6 (ikkala usulda); []string uchun generik variant kompilyatsiya vaqtida rad etadi, any variant esa faqat ishga tushganda xato beradi

20. slices va maps standart paketlaridagi umumiy funksiyalar (slices.SortFunc, slices.IndexFunc, maps.Clone, maps.Equal) dan foydalanib, talabalar ro'yxati ustida bir necha amalni bajaring va o'zingiz yozgan analoglari bilan natijalarni solishtiring.
Misol: talabalar ni bahosi bo'yicha slices.SortFunc bilan saralash, IndexFunc bilan "Vali" indeksini topish, maps.Clone va maps.Equal → true