Последний входящий параметр в сигнатуре функции может иметь тип с ... префиксом. Функция с таким параметром называется 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 с тем же базовым массивом.
Читайте также:
- Спецификация Go: типы указателя (pointer types), типы функций (function types)
- Спецификация Go: литералы функций
- Эффективный Go: функции
Комментариев нет:
Отправить комментарий