Sobes.tech
Junior — Middle

Datu nodošanai funkcijā: kas ir efektīvāk atmiņas izmantošanā — masīvs vai sēne?

sobes.tech AI

Atbilde no AI

Go valodā masīviem ir fiksēts izmērs un tie tiek pilnībā glabāti atmiņā, kamēr slices ir struktūras, kas satur norādītāju uz masīvu, garumu un kapacitāti.

No atmiņas izmantošanas viedokļa:

  • Masīvs: aizņem tieši tik daudz atmiņas, cik nepieciešams visiem elementiem, izmērs ir zināms kompilācijas laikā.
  • Slice: pati par sevi aizņem maz atmiņas (trīs vārdi: norādītājs, garums, kapacitāte), bet norāda uz masīvu, kurā glabājas dati.

Funkcijai nododot:

  • Ja nododat masīvu, tas tiek pilnībā kopēts, kas var būt dārgi atmiņas un laika ziņā lieliem masīviem.
  • Ja nododat slice, tiek kopēta tikai slice struktūra (norādītājs + garums + kapacitāte), bet dati paliek sākotnējā masīvā, tāpēc datu kopēšana nenotiek.

Tādēļ, slice nodošana ir efektīvāka atmiņas un veiktspējas ziņā, īpaši lieliem datu kopumiem.

Piemērs:

func processArray(arr [1000]int) {
    // kopē visu masīvu
}

func processSlice(s []int) {
    // kopē tikai slice struktūru
}

func main() {
    var a [1000]int
    processArray(a)    // dārgi
    processSlice(a[:]) // efektīvi
}