Ответ
У 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
}
Как это работает:
- Функция
append
проверяет, достаточно лиcapacity
у текущего слайса для добавления нового элемента. - У
nil
-слайсаcapacity
равен 0, поэтому места нет. append
выделяет память под новый массив, достаточный для хранения старых и нового элементов. Для первого элемента создается массив сcapacity
равным 1.append
возвращает новый слайс, который указывает на этот новый массив.
Важно: При последующих добавлениях, когда len
достигнет cap
, append
снова выделит новый, больший массив (часто удваивая capacity
).