Go lang x: = [...] string { "Sat", "Sun" } vs x: = [] string { "Sat", "Sun" }

В go lang spec они использовали три точки в одном из примеров:

days := [...]string{"Sat", "Sun"}  // len(days) == 2

Не имеет значения, остались ли эти три точки?

Ответ 1

Это делает довольно большую разницу: разница между array и slice.

[]string создает срез, указывающий на массив строк. С другой стороны, [...] создает фактический массив строк.

Существует большое сообщение о разнице между ними в блоге golang. Я постараюсь обобщить здесь как можно лучше.

Массивы в golang похожи на типы значений, они являются ссылками на определенный тип и всегда имеют определенную длину. Существует два способа создания массива: 1) с явной длиной и 2) неявная длина:

// Explicit length. 
var days := [7]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

// Implicit length. (Let the compiler figure it out how long it is)
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

Это эквивалентные определения массива. Обратите внимание, что длина массива является частью определения этого типа. Таким образом, вы не можете обменивать массивы аналогичного типа с разной длиной:

// These two are not interchangeable!
var someArray [5]string;
var otherArray [10]string;

func work(data [5]string) { /* ... */ }

work(someArray)  // good
work(otherArray) // not so good

Также обратите внимание, что массивы, такие как structs, передаются как value – копия массива будет передана функции, а не ссылка на нее.

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

// Create a slice
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

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

Существует также отличная статья о Go Data Structures, и как они представлены в памяти. Я настоятельно рекомендую проверить его.