54 / 68

slices

slices paketi

Go 1.21 versiyasida standart kutubxonaga slices deb nomlangan yangi paket qo'shildi. U slayslar bilan ishlashda tez-tez kerak bo'ladigan amallarni (saralash, qidirish, solishtirish, nusxalash) generic (umumlashtirilgan) funksiyalar orqali taqdim etadi — ya'ni bitta funksiya []int, []string yoki istalgan boshqa turdagi slays bilan bir xilda ishlaydi.

example.go
import "slices"

[!NOTE] slices paketidan foydalanish uchun loyihangizda Go 1.21 yoki undan yuqori versiya talab qilinadi.


1. Saralash: Sort()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{5, 2, 8, 1, 9}

    slices.Sort(nums)

    fmt.Println(nums)
}

Natija:

kod
[1 2 5 8 9]

Bu xuddi oldingi darsda ko'rgan sort.Ints() bilan bir xil vazifani bajaradi, lekin slices.Sort() — generic funksiya, ya'ni u []int, []float64, []string — qaysi turdagi slays bo'lishidan qat'i nazar bir xil nom bilan ishlaydi (sort paketida esa har bir tur uchun alohida funksiya — Ints(), Float64s(), Strings() — kerak bo'lardi).


2. Qidirish: Contains() va Index()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{5, 2, 8, 1, 9}

    fmt.Println(slices.Contains(nums, 8)) // 8 slaysda bormi?
    fmt.Println(slices.Index(nums, 8))    // 8 qaysi indeksda?
}

Natija:

kod
true
2

[!IMPORTANT] Bundan oldin, slices paketi paydo bo'lmasdan avval, slaysda element bor-yo'qligini tekshirish uchun har safar o'zimiz for sikli yozishga to'g'ri kelardi. Endi slices.Contains() shu ishni bitta qatorda bajaradi.


3. Eng katta va eng kichik elementni topish: Max() va Min()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{5, 2, 8, 1, 9}

    fmt.Println(slices.Max(nums))
    fmt.Println(slices.Min(nums))
}

Natija:

kod
9
1

4. Ikkita slaysni solishtirish: Equal()

Goda slayslarni to'g'ridan-to'g'ri == bilan solishtirib bo'lmaydi (kompilyator xatolik beradi). Buning o'rniga:

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    a := []int{1, 2, 3}
    b := []int{1, 2, 3}

    fmt.Println(slices.Equal(a, b))
}

Natija:

kod
true

5. Slaysni teskarilashtirish: Reverse()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{5, 2, 8, 1, 9}

    slices.Reverse(nums)

    fmt.Println(nums)
}

Natija:

kod
[9 1 8 2 5]

[!WARNING] slices.Sort() va slices.Reverse() slaysni o'z joyida o'zgartiradi (yangi slays qaytarmaydi). Agar asl slaysni saqlab qolish kerak bo'lsa, avval slices.Clone() bilan nusxa oling: nusxa := slices.Clone(nums).


6. Ketma-ket takrorlangan elementlarni olib tashlash: Compact()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    nums := []int{1, 2, 2, 3, 3, 3, 4}

    fmt.Println(slices.Compact(nums))
}

Natija:

kod
[1 2 3 4]

[!NOTE] Compact() faqat ketma-ket kelgan takroriy elementlarni olib tashlaydi (masalan, [1, 2, 1] da ikkita 1 ketma-ket kelmagani uchun o'chirilmaydi). Shuning uchun uni odatda avval slices.Sort() bilan saralab, keyin ishlatishadi.


7. Element qo'shish va o'chirish: Insert() va Delete()

example.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    // 2-indeksga 3 va 4 sonlarini qo'shamiz
    fmt.Println(slices.Insert([]int{1, 2, 5}, 2, 3, 4))

    // 1-indeksdan 3-indeksgacha (3 kirmaydi) bo'lgan elementlarni o'chiramiz
    fmt.Println(slices.Delete([]int{1, 2, 3, 4, 5}, 1, 3))
}

Natija:

kod
[1 2 3 4 5]
[1 4 5]

8. Struct'larni maxsus qoida bo'yicha saralash: SortFunc()

Agar struct slaysini biror maydon bo'yicha saralash kerak bo'lsa, sort.Slice()ga o'xshab, slices.SortFunc() ishlatiladi — farqi shundaki, SortFunc() bool emas, taqqoslash natijasini (-1, 0, 1) bildiruvchi son qaytaradi:

example.go
package main

import "fmt"
import "slices"

type Person struct {
    Name string
    Age  int
}

func main() {
    people := []Person{
        {"Ali", 30},
        {"Vali", 25},
    }

    slices.SortFunc(people, func(a, b Person) int {
        return a.Age - b.Age // manfiy bo'lsa a oldin, musbat bo'lsa b oldin keladi
    })

    fmt.Println(people)
}

Natija:

kod
[{Vali 25} {Ali 30}]

Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Saralashslices.Sort()
Element bor-yo'qligini tekshirishslices.Contains()
Elementning indeksini topishslices.Index()
Eng katta/kichik elementni topishslices.Max() / Min()
Ikkita slaysni solishtirishslices.Equal()
Teskarilashtirishslices.Reverse()
Ketma-ket takrorlarni olib tashlashslices.Compact()
Nusxa olish (asl slaysga tegmasdan)slices.Clone()
struct slaysini maxsus qoida bo'yicha saralashslices.SortFunc()

[!NOTE] Amaliy maslahat: Go 1.21+ loyihalarida yangi kod yozayotgan bo'lsangiz, eski sort paketi o'rniga imkon qadar slices paketini afzal ko'ring — u qisqaroq, o'qishga qulayroq va deyarli har doim tezroq ishlaydi.