Sobes.tech
Middle

Колко се увеличава размерът на слайса при използване на функцията append?

sobes.tech AI

Отговор от AI

Размерът на slice може да се увеличава по различни начини в зависимост от текущата капацитет cap(slice):

  1. Ако капацитетът не е достатъчен: Новият капацитет ще бъде поне два пъти по-голям от текущия, ако той е по-малък от 1024. Ако е по-голям от 1024, капацитетът ще се увеличава с около 25% от текущия, докато стане достатъчен. След това може да бъде коригиран нагоре.
  2. Ако капацитетът е достатъчен: Размерът на slice се увеличава точно с броя на добавените елементи, а капацитетът остава непроменен.
// Пример за поведение на append при недостатъчен капацитет
s := make([]int, 0, 0) // размер 0, капацитет 0
s = append(s, 1)       // размер 1, капацитет 1. (0 -> 1)
s = append(s, 2)       // размер 2, капацитет 2. (1 -> 2)
s = append(s, 3)       // размер 3, капацитет 4. (2 -> 4)
s = append(s, 4)       // размер 4, капацитет 4
s = append(s, 5)       // размер 5, капацитет 8. (4 -> 8)

s2 := make([]int, 0, 1025) // размер 0, капацитет 1025
s2 = append(s2, make([]int, 500)...) // размер 500, капацитет 1025 (достатъчно)
s2 = append(s2, make([]int, 1000)...) // размер 1500, около 1025 + 1025*0.25 + epsilon

Конкретният алгоритъм за увеличаване на капацитета е вътре в runtime и може да варира между версиите на Go. Въпреки това, общите правила (двоене до 1024, увеличение с около 25% след това) остават валидни.