Вариативные функции 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

Ответить