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.
import "slices"
[!NOTE]
slicespaketidan foydalanish uchun loyihangizda Go 1.21 yoki undan yuqori versiya talab qilinadi.
Sort()package main
import (
"fmt"
"slices"
)
func main() {
nums := []int{5, 2, 8, 1, 9}
slices.Sort(nums)
fmt.Println(nums)
}
Natija:
[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).
Contains() va Index()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:
true
2
[!IMPORTANT] Bundan oldin,
slicespaketi paydo bo'lmasdan avval, slaysda element bor-yo'qligini tekshirish uchun har safar o'zimizforsikli yozishga to'g'ri kelardi. Endislices.Contains()shu ishni bitta qatorda bajaradi.
Max() va Min()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:
9
1
Equal()Goda slayslarni to'g'ridan-to'g'ri == bilan solishtirib bo'lmaydi (kompilyator xatolik beradi). Buning o'rniga:
package main
import (
"fmt"
"slices"
)
func main() {
a := []int{1, 2, 3}
b := []int{1, 2, 3}
fmt.Println(slices.Equal(a, b))
}
Natija:
true
Reverse()package main
import (
"fmt"
"slices"
)
func main() {
nums := []int{5, 2, 8, 1, 9}
slices.Reverse(nums)
fmt.Println(nums)
}
Natija:
[9 1 8 2 5]
[!WARNING]
slices.Sort()vaslices.Reverse()slaysni o'z joyida o'zgartiradi (yangi slays qaytarmaydi). Agar asl slaysni saqlab qolish kerak bo'lsa, avvalslices.Clone()bilan nusxa oling:nusxa := slices.Clone(nums).
Compact()package main
import (
"fmt"
"slices"
)
func main() {
nums := []int{1, 2, 2, 3, 3, 3, 4}
fmt.Println(slices.Compact(nums))
}
Natija:
[1 2 3 4]
[!NOTE]
Compact()faqat ketma-ket kelgan takroriy elementlarni olib tashlaydi (masalan,[1, 2, 1]da ikkita1ketma-ket kelmagani uchun o'chirilmaydi). Shuning uchun uni odatda avvalslices.Sort()bilan saralab, keyin ishlatishadi.
Insert() va Delete()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:
[1 2 3 4 5]
[1 4 5]
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:
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:
[{Vali 25} {Ali 30}]
| Vazifa | Funksiya |
|---|---|
| Saralash | slices.Sort() |
| Element bor-yo'qligini tekshirish | slices.Contains() |
| Elementning indeksini topish | slices.Index() |
| Eng katta/kichik elementni topish | slices.Max() / Min() |
| Ikkita slaysni solishtirish | slices.Equal() |
| Teskarilashtirish | slices.Reverse() |
| Ketma-ket takrorlarni olib tashlash | slices.Compact() |
| Nusxa olish (asl slaysga tegmasdan) | slices.Clone() |
struct slaysini maxsus qoida bo'yicha saralash | slices.SortFunc() |
[!NOTE] Amaliy maslahat: Go 1.21+ loyihalarida yangi kod yozayotgan bo'lsangiz, eski
sortpaketi o'rniga imkon qadarslicespaketini afzal ko'ring — u qisqaroq, o'qishga qulayroq va deyarli har doim tezroq ishlaydi.