Показаны сообщения с ярлыком variadic функции в Go. Показать все сообщения
Показаны сообщения с ярлыком variadic функции в Go. Показать все сообщения

воскресенье, 12 апреля 2020 г.

Использование 3 точек в Golang

Можете ли вы назвать четыре места, где три точки (...) используются в Go?

Variadic параметры функции

Если последний параметр функции имеет тип ... T, он может быть вызван с любым числом конечных аргументов типа T. Фактический тип ... T внутри функции - это срез []T.

Этот пример функции может быть вызван, например, с помощью Sum(1, 2, 3, 4) или Sum(1, 2) или Sum() или любым другим количеством аргументов типа int.

func Sum(nums ...int) int {
    res := 0
    for _, n := range nums {
        res += n
    }
    return res
}

Аргументы к variadic функциям

Вы можете передать срез sl непосредственно в variadic функцию, если распакуете его с sl... нотацией. В этом случае новый срез не создается.

В этом примере мы передаем срез функции Sum.

primes := []int{2, 3, 5, 7}
fmt.Println(Sum(primes...)) // 17

Литералы массивов

В литерале массива нотация ... указывает длину, равную количеству элементов в литерале.

students := [...]string{"Ivan", "Anton", "Danil", "Igor"} 
// len(students) == 4

Команда go

Три точки используются командой go как подстановочный знак при описании списков пакетов.

Эта команда тестирует все пакеты в текущем каталоге и его подкаталогах.

$ go test ./...


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


суббота, 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 с тем же базовым массивом.


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