Вариативные функции Golang

Вариативная функция — это функция, которая принимает переменное количество аргументов. В Golang можно передавать различное количество аргументов того же типа, что и в сигнатуре функции. Чтобы объявить функцию с переменным числом аргументов, перед типом конечного параметра ставится многоточие “…”, это показывает, что функция может быть вызвана с любым количеством аргументов этого типа. Этот тип функции полезен, когда вы не знаете количество аргументов, которые вы передаете функции, лучшим примером является встроенная функция Println пакета fmt, которая является функцией с переменным числом аргументов.
Выберем один аргумент из всех аргументов вариационной функции.
В приведенном ниже примере мы собираемся напечатать s[0] первым и s[3] четвертым, значение аргумента передается функции variadicExample().
package main
import "fmt"
func main() {
variadicExample("red", "blue", "green", "yellow")
}
func variadicExample(s ...string) {
fmt.Println(s[0])
fmt.Println(s[3])
Вывод:
red
yellow
Передаем различные типы аргументов в вариативной функции
В следующем примере сигнатура функции принимает произвольное количество аргументов типа slice.
package main
import (
"fmt"
"reflect"
)
func main() {
variadicExample(1, "red", true, 10.5, []string{"foo", "bar", "baz"},
map[string]int{"apple": 23, "tomato": 13})
}
func variadicExample(i ...interface{}) {
for _, v := range i {
fmt.Println(v, "--", reflect.ValueOf(v).Kind())
}
}
Вывод:
[]
[red blue]
[red blue green]
[red blue green yellow]
В приведенном выше примере мы вызвали функцию с одним и несколькими аргументами; и без передачи каких-либо аргументов.
Параметр нормальной функции с вариативным параметром функции
package main
import "fmt"
func main() {
fmt.Println(calculation("Rectangle", 20, 30))
fmt.Println(calculation("Square", 20))
}
func calculation(str string, y ...int) int {
area := 1
for _, val := range y {
if str == "Rectangle" {
area *= val
} else if str == "Square" {
area = val * val
}
}
return area
}
Вывод:
600
400
Передадим различные типы аргументов в вариативной функции
В следующем примере сигнатура функции принимает произвольное количество аргументов типа slice.
package main
import (
"fmt"
"reflect"
)
func main() {
variadicExample(1, "red", true, 10.5, []string{"foo", "bar", "baz"},
map[string]int{"apple": 23, "tomato": 13})
}
func variadicExample(i ...interface{}) {
for _, v := range i {
fmt.Println(v, "--", reflect.ValueOf(v).Kind())
}
}
Вывод:
1 -- int
red -- string
true -- bool
10.5 -- float64
[foo bar baz] -- slice
map[apple:23 tomato:13] -- map
Во втором листинге Код не соответствует результату