Вопрос

я прочитал этот но до сих пор не до конца осознаю преимущества slice против arrayИтак, я ожидаю, что кто-нибудь из SO объяснит лучше, чем он, и я уверен, что вы сможете :)

Это было полезно?

Решение

Срезы имеют множество применений по сравнению с массивами, некоторые из которых уже упоминались другими авторами.

  • Срезы могут работать во многом подобно указателям.
    • Несколько срезов могут «указывать» на один и тот же базовый массив.
    • Срезы передаются по ссылке, но поскольку срез сам по себе является указателем, его можно использовать для более эффективной передачи «массивов», поскольку не требуется копировать весь массив.
  • Однако, в отличие от указателей, срезы обеспечивают дополнительную безопасность буфера.
    • Недополнение и переполнение среза вызывают исключения, а не дают вам небезопасную возможность доступа к другим областям памяти.
    • Срезы позволяют ограничить доступ только к определенным областям массива.Это может быть чрезвычайно полезно при работе с подмножествами.
  • Длина среза определяется динамически во время выполнения, в отличие от массивов, размеры которых фиксируются во время компиляции.Кроме того, размеры срезов можно динамически изменять во время выполнения.

Другие советы

В go, массивы передаются по значению;Итак, чтобы «передать по ссылке», вы используете фрагмент.И это еще не все!Цитирование Го руководство:

Размер массива является частью его типа;Тем не менее, можно объявить переменную среза, на которую можно назначить указатель на любой массив с тем же типом элемента или - более чаще всего - выражение среза формы A [низкий:Высокий], представляющий субаррей, индексируемый с помощью низкого до HIGH-1.Среции очень похожи на массивы, но не имеют явного размера ([] против10]) и они ссылаются на сегмент основного, часто анонимного, обычного массива.Несколько срезов могут обмениваться данными, если они представляют части одного и того же массива;несколько массивов никогда не смогут совместно использовать данные.

Срезы гораздо чаще встречаются в программах GO, чем обычные массивы;Они более гибкие, имеют справочную семантику и эффективны.Чего им не хватает, так это точный контроль над макетом хранения обычного массива;Если вы хотите иметь сотню элементов массива, хранящихся в вашей структуре, вам следует использовать обычный массив.

При передаче массива функции вы почти всегда хотите объявить формальный параметр как ломтик.Когда вы вызовите функцию, возьмите адрес массива и GO создаст (эффективно) ссылку на срез и передаст это.

Думаю, срезы и массивы описаны гораздо лучше и подробнее в эта почта в блоге Go.

В дополнение к уже данным ответам, срезы могут иметь динамический размер, а массивы — нет.То есть константы можно использовать только для указания размера массива, а для указания размера среза можно использовать переменную.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top