Я прочитал этот, но до сих пор не полностью осознал преимущество slice
против array
. Поэтому я ожидаю, что кто-то в SO объясните лучше, чем это, и я уверен, что вы можете:)
Какова точка типа slice в Go?
Ответ 1
Срезы имеют множество применений для массивов, некоторые из которых уже упоминались в других плакатах.
- Ломтики могут работать по-разному, как указатели.
- Несколько фрагментов могут "указывать" на тот же базовый массив
- Срезы передаются по ссылке, но поскольку сам срез является указателем, он может использоваться для передачи "массивов" гораздо более эффективно, поскольку весь массив не нужно копировать.
- Однако, в отличие от указателей, срезы обеспечивают дополнительную безопасность буфера
- Слизы переполнения и переполнения инициируют исключения, а не позволяют вам небезопасную возможность доступа к другим областям памяти.
- Срезы позволяют ограничить доступ только к определенным областям массива. Это может быть чрезвычайно полезно при работе с подмножествами.
- Длина среза динамически определяется во время выполнения, в отличие от массивов, размер которых фиксирован во время компиляции. Кроме того, срезы могут быть динамически изменены во время выполнения.
Ответ 2
В go
массивы передаются по значению; поэтому, чтобы "пройти по ссылке", вы используете срез. И это не все! Quoting Go tutorial:
Размер массива является частью его тип; однако можно объявить срез переменной, которой можно присвоить указатель на любой массив с тем же тип элемента или - гораздо чаще - a срезное выражение вида a [low: высокий], представляющий подмассиву индексируется с низким до максимума-1. Ломтики много похоже на массивы, но не имеют явный размер ([] против [10]), и они ссылаться на сегмент базового, часто анонимный, регулярный массив. Несколько фрагментов могут обмениваться данными, если они представляют части одного массива; несколько массивов никогда не могут обмениваться данными.
Ломтики гораздо чаще встречаются в Go программ, чем обычные массивы; они более гибкие, имеют ссылку семантики и эффективны. Какие им не хватает точного контроля над расположение хранилища регулярного массива; если вы хотите иметь сотню элементов массив, хранящийся в вашей структуре, вы должны использовать обычный массив.
При передаче массива функции, вы почти всегда хотите объявить формальный параметр - срез. когда вы вызываете функцию, адрес массива и Go будет создать (эффективно) ссылку на срез и передать это.
Ответ 3
Срезки обеспечивают безопасный, эффективный способ ссылки, доступа и мутирования смежных частей массива без копирования всего массива (поскольку объекты и массивы передаются по значению) или передачи указателя на массив, начального индекса, и длину.
Ответ 4
Я думаю, что фрагменты и массивы описываются намного лучше и более подробно в этот пост в блоге Go.
Ответ 5
В дополнение к уже указанным ответам срезы могут быть динамически разнесены, а массивы не могут быть. То есть вы можете использовать константы только для указания размера массива, в то время как вы можете использовать переменную, чтобы указать размер среза.