Что произойдет с длиной (len) и вместимостью (cap) nil-слайса, если добавить в него 10 элементов? Рассмотрите разные способы добавления.

Ответ

Изначально 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