Variadic Functions

Variadic Functions #

// [_Funções variádicas_](https://en.wikipedia.org/wiki/Variadic_function)
// podem ser chamads com qualquer número de argumentos.
// Por exemplo, `fmt.Println` é uma função variádica
// comumente utilizada.

package main

import "fmt"

// Aqui está uma função que aceitará um número arbitrário de
// inteiros `int`s como argumento(s).
// Atenção para o operador de espalhamento (spread operator)
// que deve preceder a declaração do tipo.
func sum(nums ...int) {
	fmt.Print(nums, " ")
	total := 0
	// Dentro da função, o tipo `nums` é
	// equivalente a `[]int`. É possível usar `len(nums)`,
	// iterar utilizando `range`, etc.
	for _, num := range nums {
		total += num
	}
	fmt.Println(total)
}

func main() {

	// Funções variádicas pode ser chamada de
	// forma usual com argumentos individuais.
	sum(1, 2)
	sum(1, 2, 3)

	// Se uma slice com multiplos argumentos estiver
	// disponível, é possível passá-la como parâmetro
	// para uma função variádica usando `func(slice...)`.
	// Atenção que agora o operador de espalhamento deve
	// suceder o nome do parâmetro.
	nums := []int{1, 2, 3, 4}
	sum(nums...)
}
$ go run variadic-functions.go 
[1 2] 3
[1 2 3] 6
[1 2 3 4] 10

# Outro aspecto chave de funções em Go é a
# capacidade para formar fechamentos (closures),
# que serão apresentados em seguida.