Токен ... используется для массивов и он имеет огромный смысл именно потому, что массивы в Go имеют фиксированную длину.
Дело в том, что ... в контексте массивов решает проблему ручного подсчета элементов.
Как это работает
Когда объявляется массив в Go, мы обязаны указать его размер:
var arr [5]int = [5]int{10, 20, 30, 40, 50}Если мы захотим добавить в этот массив еще один элемент (например, 60), нам придется изменить размер в двух местах:
var arr [6]int = [6]int{10, 20, 30, 40, 50, 60} // Изменили 5 на 6 в типе и в инициализатореЧтобы избавиться от этого рутинного подсчета, в Go и был введен токен ... для массивов:
arr := [...]int{10, 20, 30, 40, 50}Здесь мы как бы говорим компилятору: “Посчитай сам, сколько здесь элементов, и подставь это число в тип массива”.
Очень важно понимать: ... здесь не делает массив динамическим. Результатом выполнения [...]int{10, 20, 3} будет обычный статический массив [3]int. Как только компилятор посчитал элементы, размер жестко фиксируется.
В чем отличие от слайсов?
Если нам нужна структура данных, размер которой может меняться во время выполнения программы (добавление/удаление элементов), мы используем слайсы (slices).
Разница в синтаксисе:
[...]int{1, 2, 3}— это массив фиксированного размера[3]int. Добавить 4-й элемент в него нельзя (размер зашит в тип).[]int{1, 2, 3}— это слайс. У него под капотом скрыт массив, но сам слайс может динамически расти с помощьюappend().
Итог:
Для массивов ... существует, и он имеет смысл: это синтаксический сахар для автоматического вычисления размера массива на этапе компиляции. Он не нарушает правило о фиксированности массивов, а лишь автоматизирует их создание.