В Go слайс — это структура, которая содержит указатель на массив, длину (len) и емкость (capacity). Емкость — это максимальное количество элементов, которое может вместить текущий массив.
Что происходит, когда ты добавляешь элемент через append в слайс, у которого capacity уже полностью использован?
В Go слайс — это структура, которая содержит указатель на массив, длину (len) и емкость (capacity). Емкость — это максимальное количество элементов, которое может вместить текущий массив.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Go слайс — это структура, которая содержит указатель на массив, длину (len) и емкость (capacity). Емкость — это максимальное количество элементов, которое может вместить текущий массив.
Если у слайса capacity равна 8, и мы пытаемся добавить девятый элемент с помощью append, то происходит следующее:
- Go выделит новый массив с увеличенной емкостью (обычно в 2 раза больше текущей, то есть примерно 16).
- Скопирует все существующие элементы в новый массив.
- Добавит новый элемент.
- Вернёт новый слайс, указывающий на этот новый массив с обновлённой длиной и емкостью.
Таким образом, append автоматически расширяет слайс при превышении capacity, обеспечивая динамическое увеличение размера.
Пример:
s := make([]int, 8, 8) // длина и емкость 8
s = append(s, 9) // добавляем 9-й элемент
fmt.Println(len(s)) // 9
fmt.Println(cap(s)) // >= 9, обычно 16