💬В чем разница между длиной и емкостью среза в Go?
📌Внутри срез содержит указатель на резервный массив, а также длину и емкость👇
◾Длина среза указывает на количество элементов, которые в данный момент содержатся в срезе. Это число элементов, доступных для непосредственного использования и итерации.
◾Емкость среза отражает общее количество элементов, которые срез может содержать, не требуя дополнительного выделения памяти.
◽️Если при добавлении новых элементов в срез его длина превышает емкость, система выделит новый, больший участок памяти для этого среза, и старый участок памяти будет освобожден.
◽️Важно отметить, что длина среза не может превышать его емкость. В Go есть встроенные функции
◽️Когда мы создаем срез, мы можем указать как его длину, так и емкость. Если указать только длину, емкость будет установлена равной длине. Мы можем создавать срезы с начальной емкостью больше длины, чтобы оптимизировать производительность при последующем добавлении элементов, минимизируя количество операций выделения памяти.
📌Простой пример:
◽️В данном случае создается массив из шести элементов, но поскольку длина была установлена равной 3, Go инициализирует только первые три элемента. Кроме того, поскольку срез является типом
👉О распространенных ошибках при работе со срезами читайте здесь.
📌Внутри срез содержит указатель на резервный массив, а также длину и емкость👇
◾Длина среза указывает на количество элементов, которые в данный момент содержатся в срезе. Это число элементов, доступных для непосредственного использования и итерации.
◾Емкость среза отражает общее количество элементов, которые срез может содержать, не требуя дополнительного выделения памяти.
◽️Если при добавлении новых элементов в срез его длина превышает емкость, система выделит новый, больший участок памяти для этого среза, и старый участок памяти будет освобожден.
◽️Важно отметить, что длина среза не может превышать его емкость. В Go есть встроенные функции
len
и cap
, которые позволяют получить длину и емкость среза. ◽️Когда мы создаем срез, мы можем указать как его длину, так и емкость. Если указать только длину, емкость будет установлена равной длине. Мы можем создавать срезы с начальной емкостью больше длины, чтобы оптимизировать производительность при последующем добавлении элементов, минимизируя количество операций выделения памяти.
📌Простой пример:
s := make([]int, 3, 6)
fmt.Println(s) // [0 0 0]
◽️В данном случае создается массив из шести элементов, но поскольку длина была установлена равной 3, Go инициализирует только первые три элемента. Кроме того, поскольку срез является типом
[]int
, первые три элемента инициализируются нулевым значением int
: 0.👉О распространенных ошибках при работе со срезами читайте здесь.