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