Sobes.tech
Junior — Middle

Когато предавате данни към функция: кое е по-ефективно по отношение на използването на памет — масив или срез?

sobes.tech AI

Отговор от AI

В Go масивите имат фиксиран размер и се съхраняват изцяло в паметта, докато срезовете (slices) са структура, която съдържа указател към масив, дължина и капацитет.

От гледна точка на използването на памет:

  • Масив: заема точно паметта за всички елементи, размерът е известен по време на компилация.
  • Срез: сам по себе си заема малко памет (три думи: указател, дължина, капацитет), но сочи към масив, който съхранява данните.

При предаване към функция:

  • Ако се предаде масив, той се копира изцяло, което може да е скъпо по памет и време при големи размери.
  • Ако се предаде срез, се копира само структурата на среза (указател + дължина + капацитет), а данните остават в оригиналния масив, тоест няма копиране на данни.

Затова предаването на срез е по-ефективно по отношение на използването на памет и производителност, особено за големи набори от данни.

Пример:

func processArray(arr [1000]int) {
    // копира цял масив
}

func processSlice(s []int) {
    // копира само структурата на среза
}

func main() {
    var a [1000]int
    processArray(a)    // скъпо
    processSlice(a[:]) // ефективно
}