Tarkibga o'tish

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:

[78 91 0 0]
Uzunligi: 4

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:

[qizil yashil ko‘k]
[10 20 30 40] 4

[...]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:

0-indeks: 78
1-indeks: 91
2-indeks: 85
3-indeks: 88
O‘rtacha: 85.5

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:

Asl: [1 2 3]
Nusxa: [99 2 3]

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:

// Kompilyatsiya xatosi:
// numbers := make([5]int)

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:

[10 0 0]
Uzunlik: 3 Sig‘im: 5

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 0 dan boshlanadi, qiymat berilmagan elementlar nol qiymat oladi.
  • Massiv tayinlanganda to‘liq nusxalanadi.
  • make massiv emas, slice, map va channel uchun ishlatiladi.

Keyingi darsda massiv ustidagi moslashuvchan ko‘rinish — slice, uning uzunligi, sig‘imi va append ishlashi o‘rganiladi.