Почему массивы нельзя использовать _directly_ при вызове функции с переменным числом в Go? - PullRequest
0 голосов
/ 12 апреля 2019

В чем причина, учитывая, что (переменная) функция

func varargs(n ...int) {}

это можно назвать как

varargs(1, 2, 3, 4) // Fixed number of arguments

, но не с массивом :

a := [4]int{1, 2, 3, 4} // Fixed number of elements
varargs(a...) // Error: cannot use (type [4]int) as type []int in argument

Я понимаю, почему

var s []int = a

не сработает: предотвращает случайное неправильное использование, требует ручной нарезки:

s := a[:]

Но почему это ограничение распространяется на вызовы функций с переменными числами?


Бонусный вопрос:
И наоборот, зачем звонить

func fourargs(w, x, y, z int) {}

с массивом из 4 элементов как

fourargs(a...) // Error: not enough arguments in call  have ([4]int...)  
               //                                      want (int, int, int, int)

также быть запрещено?
Это может быть проверено типом во время компиляции.

1 Ответ

6 голосов
/ 12 апреля 2019

Spec: Передача аргументов в ... параметры:

Если последний аргумент присваивается типу среза []T, он можетпередается без изменений в качестве значения параметра ...T, если за аргументом следует ....В этом случае новый срез не создается.

Таким образом, когда у вас есть срез, и вы передаете его в качестве значения параметра variadic, новый срез не создается, он просто назначается.

Если у вас есть массив другого типа, который нельзя назначить типу слайса.Поэтому это не разрешено.

Сначала вы должны нарезать массив, что вы можете сделать без промежуточной переменной:

a := [4]int{1, 2, 3, 4}
varargs(a[:]...)

Да, вы могли бы сказать, что это автоматическое нарезание может происходить автоматически / внутри,Почему это не разрешено, основано на мнении (и принадлежит авторам Go).По сути, в Go массивы являются вторичными.Ломтики - это путь.Во-первых, у вас должен быть срез, который вы можете пропустить, и у вас нет проблем.См. Связанные вопросы: Почему массивы в Go? и Передача указателя слайса в качестве аргумента .

...