💬В чем разница между длиной и емкостью среза в Go?



📌Внутри срез содержит указатель на резервный массив, а также длину и емкость👇



Длина среза указывает на количество элементов, которые в данный момент содержатся в срезе. Это число элементов, доступных для непосредственного использования и итерации.



Емкость среза отражает общее количество элементов, которые срез может содержать, не требуя дополнительного выделения памяти.



◽️Если при добавлении новых элементов в срез его длина превышает емкость, система выделит новый, больший участок памяти для этого среза, и старый участок памяти будет освобожден.



◽️Важно отметить, что длина среза не может превышать его емкость. В Go есть встроенные функции len и cap, которые позволяют получить длину и емкость среза.



◽️Когда мы создаем срез, мы можем указать как его длину, так и емкость. Если указать только длину, емкость будет установлена равной длине. Мы можем создавать срезы с начальной емкостью больше длины, чтобы оптимизировать производительность при последующем добавлении элементов, минимизируя количество операций выделения памяти.



📌Простой пример:

s := make([]int, 3, 6)

fmt.Println(s) // [0 0 0]





◽️В данном случае создается массив из шести элементов, но поскольку длина была установлена ​​равной 3, Go инициализирует только первые три элемента. Кроме того, поскольку срез является типом []int, первые три элемента инициализируются нулевым значением int: 0.



👉О распространенных ошибках при работе со срезами читайте здесь.