Разница между массивом и слайсом в Go

Введение

Основная разница:
массив — это структура которая хранит в себе некоторое количество элементов одного типа, и как следствие одного размера. Такая структура всегда занимает место равное размеру одного элемента помноженного на количество элементов. Память под такую структуру выделяется сразу же в зависимости от количества элементов которые нужно разместить. Для того, что бы изменить размер массива, нужно выделить другую область памяти под другое количество элементов и скопировать туда нужные элементы. Обращение к такому элементу всегда осуществляется по адресу, которое вычисляется путем умножения номера нужного элемента на размер одного элемента и добавление этого значения к адресу первого элемента (который так же считается адресом самого массива, именно по этому в этой структуре обязательна фиксированная длина элемента.

Слайс — это структура которая используется для работы с набором данных вместо массива. Слайс является структурой строго фиксированного размера так как содержит в себе указатель на сам массив а так же норма первого элемента и длину. Таким образом, если слайс не является срезом всего массива на который он ссылается, то можно сказать, что он имеет какое то количество зарезервированного места для добавления других элементов. В случае если все ячейки массива используются и добавлять новые элементы некуда функция append() сама выделит место под новый массив в два раза больше того что есть сейчас и скопирует туда все элементы, плюс добавит новые на которые до этого места не хватало, после этого еще несколько элементов будут добавлены без дополнительных затрат ресурсов пока есть зарезервированное место в новом массиве.

Объявление

разница объявления массивов и слайсов заключается только в том, что в случае слайса в квадратных скобках не указывается длина слайса

Примечание

  • функция append() всегда работает только со слайсами
  • разные слайсы могут ссылаться на один и тот же массив, что может привести к изменению элементов в двух слайсах одновременно при попытке изменить элемент только в одном
  • Так как в Go все передаваемое в функцию копируется, то копируется и сама структура слайса, но из за того, что сам слайс не хранит данных а только ссылается на массив с данными, получается что передача слайса происходит по ссылке так как этот слайс содержит ссылку

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>