Переменное число аргументов в Go
Давайте теперь будем принимать в функцию сколько угодно чисел одного типа. Последний параметр помечают тремя точками перед типом, а внутри функции это имя ведет себя как срез того же типа.
Сложим произвольный набор целых в функции sum:
package main
import "fmt"
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(sum(1, 2, 3)) // выведет 6
}
Внутри sum имя nums уже срез, по нему можно идти циклом
range. Количество аргументов при вызове может быть разным, тип
каждого совпадает с типом элемента. Один аргумент тоже допустим:
package main
import "fmt"
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(sum(5)) // выведет 5
}
Это не значение по умолчанию у обычного параметра. Обычный параметр нельзя опустить и нельзя подписать именем при вызове. Три точки относятся только к последнему параметру и собирают хвост аргументов в срез.
Даны числа:
a := 2
b := 3
c := 4
Напишите функцию sum с переменным числом параметров int,
которая возвращает сумму. Выведите результат, передав a,
b и c.
Напишите функцию func с параметром ... int, которая
возвращает len от внутреннего среза. Проверьте на трех
литералах и на одном.
Скажите, какой тип у параметра nums внутри тела sum
после объявления с тремя точками.