Ответ
Изначально nil
-слайс имеет len = 0
и cap = 0
.
Поведение len
и cap
зависит от способа добавления элементов. Рассмотрим два основных сценария:
1. Поэлементное добавление в цикле
Это самый распространенный случай на собеседованиях, так как он демонстрирует механизм роста вместимости слайса.
var s []int
for i := 0; i < 10; i++ {
s = append(s, i)
// fmt.Printf("len: %d, cap: %dn", len(s), cap(s))
}
При каждом вызове append
, если вместимости (cap
) не хватает, Go выделяет новый, больший массив и копирует в него старые элементы. Вместимость растет экспоненциально. Типичная последовательность роста cap
для 10 элементов может быть такой:
0 -> 1 -> 2 -> 4 -> 8 -> 16
- Итоговый
len
:10
- Итоговый
cap
:16
(или другое значение >= 10, в зависимости от версии Go и размера слайса, но обычно это степень двойки).
2. Использование make
для предварительной аллокации
Это наиболее эффективный способ, если вы заранее знаете количество элементов.
// Создаем слайс с len=0, но с cap=10
s := make([]int, 0, 10)
for i := 0; i < 10; i++ {
s = append(s, i)
}
В этом случае переаллокации памяти не происходит, так как мы сразу выделили достаточно места.
- Итоговый
len
:10
- Итоговый
cap
:10