Middle
Колко се увеличава размерът на слайса при използване на функцията append?
sobes.tech AI
Отговор от AI
Размерът на slice може да се увеличава по различни начини в зависимост от текущата капацитет cap(slice):
- Ако капацитетът не е достатъчен: Новият капацитет ще бъде поне два пъти по-голям от текущия, ако той е по-малък от 1024. Ако е по-голям от 1024, капацитетът ще се увеличава с около 25% от текущия, докато стане достатъчен. След това може да бъде коригиран нагоре.
- Ако капацитетът е достатъчен: Размерът на 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% след това) остават валидни.