Вопрос
я прочитал этот но до сих пор не до конца осознаю преимущества slice
против array
Итак, я ожидаю, что кто-нибудь из SO объяснит лучше, чем он, и я уверен, что вы сможете :)
Решение
Срезы имеют множество применений по сравнению с массивами, некоторые из которых уже упоминались другими авторами.
- Срезы могут работать во многом подобно указателям.
- Несколько срезов могут «указывать» на один и тот же базовый массив.
- Срезы передаются по ссылке, но поскольку срез сам по себе является указателем, его можно использовать для более эффективной передачи «массивов», поскольку не требуется копировать весь массив.
- Однако, в отличие от указателей, срезы обеспечивают дополнительную безопасность буфера.
- Недополнение и переполнение среза вызывают исключения, а не дают вам небезопасную возможность доступа к другим областям памяти.
- Срезы позволяют ограничить доступ только к определенным областям массива.Это может быть чрезвычайно полезно при работе с подмножествами.
- Длина среза определяется динамически во время выполнения, в отличие от массивов, размеры которых фиксируются во время компиляции.Кроме того, размеры срезов можно динамически изменять во время выполнения.
Другие советы
В go
, массивы передаются по значению;Итак, чтобы «передать по ссылке», вы используете фрагмент.И это еще не все!Цитирование Го руководство:
Размер массива является частью его типа;Тем не менее, можно объявить переменную среза, на которую можно назначить указатель на любой массив с тем же типом элемента или - более чаще всего - выражение среза формы A [низкий:Высокий], представляющий субаррей, индексируемый с помощью низкого до HIGH-1.Среции очень похожи на массивы, но не имеют явного размера ([] против10]) и они ссылаются на сегмент основного, часто анонимного, обычного массива.Несколько срезов могут обмениваться данными, если они представляют части одного и того же массива;несколько массивов никогда не смогут совместно использовать данные.
Срезы гораздо чаще встречаются в программах GO, чем обычные массивы;Они более гибкие, имеют справочную семантику и эффективны.Чего им не хватает, так это точный контроль над макетом хранения обычного массива;Если вы хотите иметь сотню элементов массива, хранящихся в вашей структуре, вам следует использовать обычный массив.
При передаче массива функции вы почти всегда хотите объявить формальный параметр как ломтик.Когда вы вызовите функцию, возьмите адрес массива и GO создаст (эффективно) ссылку на срез и передаст это.
Думаю, срезы и массивы описаны гораздо лучше и подробнее в эта почта в блоге Go.
В дополнение к уже данным ответам, срезы могут иметь динамический размер, а массивы — нет.То есть константы можно использовать только для указания размера массива, а для указания размера среза можно использовать переменную.