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[:]) // ефективно
}