суббота, 8 июня 2019 г.

Спецификация Go: передача аргументов в ... параметрах

Последний входящий параметр в сигнатуре функции может иметь тип с ... префиксом. Функция с таким параметром называется variadic и может вызываться с нулевым или большим количеством аргументов для этого параметра.

Если f - это variadic функция, с конечным параметром p типа ... T, то в пределах f тип p эквивалентен типу []T. Если f вызывается без фактических аргументов для p, значение, переданное p, равно nil. В противном случае передаваемое значение является новым срезом типа []T с новым базовым массивом, чьи последовательные элементы являются фактическими аргументами, которые должны быть назначены для T. Следовательно, длина и емкость среза - это количество аргументов, связанных с р и может отличаться для каждого места вызова.

Даны функция и вызовы

func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")

в Greeting, who будет иметь значение nil в первом вызове и []string{"Joe", "Anna", "Eileen"} во втором.

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

Даны срез s и вызов

s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)

в Greeting, who будет иметь то же значение, что и s с тем же базовым массивом.


Читайте также:


Комментариев нет:

Отправить комментарий