Теория · урок 1 из 3

Устройство среза

Срез в Go — это маленькая структура из трёх полей: указатель на подлежащий массив, длина (len) и ёмкость (cap).

GO
s := make([]int, 3, 8)
fmt.Println(len(s), cap(s)) // 3 8

Когда append превышает ёмкость, рантайм выделяет новый массив (пока срез мал — примерно вдвое больше), копирует элементы и возвращает срез поверх нового массива. Поэтому append может как разделять память со старым срезом, так и «отъехать» на собственную — от этого зависят все классические сюрпризы с алиасингом.