Sobes.tech
Senior

Mis on slice? Mis on slice'i kapoti all? Kuidas töötab funktsioon append?

sobes.tech AI

Vastus AI-lt

Go keeles on lõik (slice) dünaamiline massiiv, mis esindab struktuuri kolme väljakuga:

  • Indikaator massiivi (põhimassiiv mälus)
  • Pikkus (len) — lõigu saadaval olevate elementide arv
  • Mahutavus (cap) — maksimaalne elementide arv, mida põhimassiiv alates indikaatorist võib mahutada

Taga plaanis on lõik väike struktuur, umbes selline:

type sliceHeader struct {
    Data uintptr // indikaator esimesele elemendile massiivis
    Len  int
    Cap  int
}

append funktsioon lisab elemente lõigule. Kui lõigu pikkus on väiksem mahutavusest, kirjutab append lihtsalt uued elemendid põhimassiivi ja suurendab pikkust. Kui pikkus jõuab mahutavuseni, eraldab append uue massiivi suurema mahutavusega (tavaliselt kahekordne), kopeerib vanad elemendid, lisab uued ja tagastab uue lõigu uuendatud indikaatoriga.

Näide:

s := []int{1, 2, 3}
s = append(s, 4) // kui cap(s) > len(s), lihtsalt lisab 4

// kui cap(s) == len(s), eraldab uue massiivi, kopeerib [1,2,3], lisab 4

Seega võib append tagastada uue lõigu, ning on oluline tulemuse uuesti määrata.