Какой будет `capacity` у `nil`-слайса после добавления в него одного элемента?

Ответ

У nil-слайса capacity равен 0. После добавления первого элемента с помощью append, Go выделит новый нижележащий массив, и capacity нового слайса станет 1.

package main

import "fmt"

func main() {
    var s []int // s == nil, len(s) == 0, cap(s) == 0

    s = append(s, 42) // Добавляем первый элемент

    fmt.Printf("len=%d cap=%dn", len(s), cap(s)) // Выведет: len=1 cap=1
}

Как это работает:

  1. Функция append проверяет, достаточно ли capacity у текущего слайса для добавления нового элемента.
  2. У nil-слайса capacity равен 0, поэтому места нет.
  3. append выделяет память под новый массив, достаточный для хранения старых и нового элементов. Для первого элемента создается массив с capacity равным 1.
  4. append возвращает новый слайс, который указывает на этот новый массив.

Важно: При последующих добавлениях, когда len достигнет cap, append снова выделит новый, больший массив (часто удваивая capacity).