Подтвердить что ты не робот

Какова точка типа slice в Go?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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