Sobes.tech
Middle

Ce se întâmplă cu un slice în Go atunci când crește și ajunge la limita de capacitate? Cum funcționează logica la adăugarea de elemente noi?

sobes.tech AI

Răspuns de la AI

Когда слайс в Go достигает своей текущей ёмкости (capacity) и в него пытаются добавить новый элемент через append, происходит перераспределение памяти:

  1. Создаётся новый массив с увеличенной ёмкостью. Обычно новая capacity примерно в 2 раза больше старой, но точный алгоритм зависит от реализации и размера слайса.
  2. Содержимое старого массива копируется в новый.
  3. Новый элемент добавляется в новый массив.
  4. Слайс начинает ссылаться на новый массив с обновлённой длиной и ёмкостью.

Это позволяет слайсам динамически расти, но при этом операция добавления может быть дорогостоящей, если происходит перераспределение.

Пример:

s := make([]int, 0, 2) // длина 0, capacity 2
s = append(s, 1, 2)     // теперь длина 2, capacity 2
s = append(s, 3)        // capacity увеличится, например, до 4

Таким образом, append автоматически управляет ростом слайса, скрывая детали перераспределения от разработчика.