В чем смысл типа среза в Go? - PullRequest
24 голосов
/ 20 января 2010

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

Ответы [ 4 ]

19 голосов
/ 24 января 2010

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

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

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

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

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

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

2 голосов
/ 02 июня 2011

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

0 голосов
/ 20 января 2010

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

...