В go lang spec они использовали три точки в одном из примеров:
days := [...]string{"Sat", "Sun"} // len(days) == 2
Не имеет значения, остались ли эти три точки?
В go lang spec они использовали три точки в одном из примеров:
days := [...]string{"Sat", "Sun"} // len(days) == 2
Не имеет значения, остались ли эти три точки?
Это делает довольно большую разницу: разница между 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, и как они представлены в памяти. Я настоятельно рекомендую проверить его.