Sobes.tech
Middle

Was passiert mit einem Slice in Go, wenn es wächst und seine Kapazitätsgrenze erreicht? Wie funktioniert die Logik beim Hinzufügen neuer Elemente?

sobes.tech KI

Antwort von 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 автоматически управляет ростом слайса, скрывая детали перераспределения от разработчика.