cpp

Переменное количество параметров

Количество параметров в функции может быть произвольным. Например, мы очень часто пользовались функций Println(), которая имеет следующий формат:

fmt.Println(a ...interface{}) (n int, err error)

Тип interface{} означает, что мы можем передавать данные любых типов, а троеточие говорит, что данных может быть сколько угодно:

fmt.Println(10)         // 10
fmt.Println(20, 30)     // 20 30
fmt.Println(40, 50, 60) // 40 50 60

Если ожидается произвольное количество значений, то их может не быть и вовсе:

fmt.Println()

Итак, значения, переданные при вызове в большем количестве, чем указано параметров при объявлении, можно поместить в слайс. Для этого перед типом параметра указываются три точки (оператор REST). Такой параметр должен быть расположен после всех остальных параметров. В качестве примера напишем функцию суммирования произвольного количества целых чисел (листинг 10.11).

Листинг 10.11. Переменное количество параметров

package main

import "fmt"

func main() {
   fmt.Println(Sum(10, 20))      // 30
   fmt.Println(Sum(5, 6, 7, 20)) // 38
}
func Sum(x int, y int, arr ...int) int {
   result := x + y
   for _, value := range arr {
      result += value
   }
   return result
}

Первые два значения будут присвоены переменным x и y, а все остальные будут добавлены в слайс arr. Конечно же в этом примере первые два параметра мы можем убрать полностью и оставить только один параметр с оператором REST. Просто хотелось показать, что могут быть и обычные параметры, а параметр с оператором REST должен быть расположен последним.

Если указан оператор REST, а данные хранятся в слайсе, то можно выполнить распаковку слайса, указав после переменной или слайса троеточие (оператор SPREAD):

arr := []int{5, 6, 7, 20}
fmt.Println(Sum(1, 2, arr...))                // 41
fmt.Println(Sum(1, 2, []int{5, 6, 7, 20}...)) // 41

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp