Sobes.tech
Back to questions
Senior
5

Что такое слайс? Что под капотом у слайса? Как работает функция append?

Companies where asked
Lenta Tech

Answer from AI

sobes.tech AI

Слайс в Go — это динамический массив, который представляет собой структуру с тремя полями:

  • Указатель на массив (подложенный массив в памяти)
  • Длина (len) — количество элементов, доступных в слайсе
  • Ёмкость (cap) — максимальное количество элементов, которое может вместить подложенный массив начиная с указателя

Под капотом слайс — это небольшая структура, примерно так:

type sliceHeader struct {
    Data uintptr // указатель на первый элемент массива
    Len  int
    Cap  int
}

Функция append добавляет элементы в слайс. Если длина слайса меньше ёмкости, append просто записывает новые элементы в подложенный массив и увеличивает длину. Если же длина достигла ёмкости, append выделяет новый массив с увеличенной ёмкостью (обычно в 2 раза больше), копирует туда старые элементы, добавляет новые, и возвращает новый слайс с обновлённым указателем.

Пример:

s := []int{1, 2, 3}
s = append(s, 4) // если cap(s) > len(s), просто добавит 4

// если cap(s) == len(s), выделит новый массив, скопирует [1,2,3], добавит 4

Таким образом append может возвращать новый слайс, и важно присваивать результат обратно.