Go’da massiv va make funksiyasi
Massiv (array) bir xil turdagi, soni oldindan ma’lum elementlarni ketma-ket saqlaydi. Masalan, haftaning yetti kunidagi haroratni [7]float64 massivida saqlash mumkin.
Go’da massiv uzunligi uning turining bir qismidir. [3]int va [4]int ikki xil tur hisoblanadi. Shu sabab massiv yaratilgach, uning uzunligini o‘zgartirib bo‘lmaydi.
Massivni e’lon qilish
Massiv turi [uzunlik]elementTuri ko‘rinishida yoziladi:
package main
import "fmt"
func main() {
var ballar [4]int
ballar[0] = 78
ballar[1] = 91
fmt.Println(ballar)
fmt.Println("Uzunligi:", len(ballar))
}
Natija:
var ballar [4]int to‘rtta int uchun joy tayyorlaydi. Qiymat berilmagan elementlar int turining nol qiymati — 0 bilan to‘ldiriladi. Indekslar 0 dan boshlanadi, shuning uchun oxirgi element indeksi 3 bo‘ladi.
Warning
ballar[4] ga murojaat qilish chegaradan tashqariga chiqishdir. Indeks kompilyatsiya vaqtida ma’lum bo‘lsa, kompilyator xato beradi. Indeks runtime’da aniqlansa, dastur panic bilan to‘xtaydi.
Massiv literalari
Qiymatlarni e’lon qilish paytida berish mumkin:
package main
import "fmt"
func main() {
ranglar := [3]string{"qizil", "yashil", "ko‘k"}
sonlar := [...]int{10, 20, 30, 40}
fmt.Println(ranglar)
fmt.Println(sonlar, len(sonlar))
}
Natija:
[...]int yozilganda uzunlikni kompilyator berilgan elementlar sonidan hisoblaydi. Natijadagi tur baribir [4]int bo‘ladi.
Massiv bo‘ylab yurish
range indeks va element qiymatini qaytaradi:
package main
import "fmt"
func main() {
ballar := [4]int{78, 91, 85, 88}
yigindi := 0
for indeks, ball := range ballar {
fmt.Printf("%d-indeks: %d\n", indeks, ball)
yigindi += ball
}
fmt.Println("O‘rtacha:", float64(yigindi)/float64(len(ballar)))
}
Natija:
Bo‘lishdan oldin operandlar float64 ga ochiq o‘girildi. Aks holda int / int kasr qismini tashlab yuboradi.
Massiv qiymat sifatida nusxalanadi
Massiv boshqa o‘zgaruvchiga berilganda yoki funksiyaga uzatilganda barcha elementlari nusxalanadi:
package main
import "fmt"
func main() {
asl := [3]int{1, 2, 3}
nusxa := asl
nusxa[0] = 99
fmt.Println("Asl:", asl)
fmt.Println("Nusxa:", nusxa)
}
Natija:
Bu xususiyat massivni slice’dan ajratib turadi. Katta massivni funksiyaga qayta-qayta uzatish nusxalash xarajatini oshirishi mumkin. Bunday holatda ko‘pincha slice ishlatiladi.
Bir xil turdagi massivlar taqqoslanadi: a == b har bir mos elementni solishtiradi. Element turi taqqoslanmaydigan bo‘lsa, massiv ham taqqoslanmaydi.
make massiv uchun ishlatilmaydi
make — slice, map va channel qiymatlarini tayyorlash uchun Go’ning ichki funksiyasi. Massiv uchun make ishlatib bo‘lmaydi:
Slice yaratishda esa make uzunlik va sig‘imni belgilaydi:
package main
import "fmt"
func main() {
sonlar := make([]int, 3, 5)
sonlar[0] = 10
fmt.Println(sonlar)
fmt.Println("Uzunlik:", len(sonlar), "Sig‘im:", cap(sonlar))
}
Natija:
make([]int, 3, 5) uzunligi 3, sig‘imi 5 bo‘lgan slice yaratadi. Dastlab faqat 0, 1 va 2 indekslariga murojaat qilish mumkin. Sig‘imda qo‘shimcha joy borligi sonlar[3] darhol yaroqli degani emas; uzunlik append yoki qayta kesish orqali oshiriladi. Slice keyingi darsda batafsil ko‘riladi.
Qachon massiv ishlatiladi?
Massiv elementlar soni tur ma’nosining bir qismi bo‘lganda foydali. Masalan, IPv4 manzilini [4]byte, 32 baytli xeshni [32]byte bilan ifodalash mumkin. Kundalik dasturlarda elementlar soni o‘zgaradigan bo‘lsa, slice qulayroq.
Xulosa
- Massivning uzunligi o‘zgarmaydi va uning turiga kiradi.
- Indeks
0dan boshlanadi, qiymat berilmagan elementlar nol qiymat oladi. - Massiv tayinlanganda to‘liq nusxalanadi.
makemassiv emas, slice,mapva channel uchun ishlatiladi.
Keyingi darsda massiv ustidagi moslashuvchan ko‘rinish — slice, uning uzunligi, sig‘imi va append ishlashi o‘rganiladi.