Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender sobre funções literais
  2. Entender como declara uma funções literal

A linguagem Go utiliza conceitos mais modernos. Um deles é o uso de funções anônimas/literais que nada mais são do que uma funções sem nome atribuídas à alguma variável

As funções literais possuem as mesmas características das funções já vistas.

Todas os assuntos relacionadas à funções que foram estudados em Funções são válidos para funções literais.

Por se uma função literal, a sua declaração é feita e atribuído a uma variável. Tanto uma função literal quanto não literal são do tipo Function.

Sintaxe: Declaração
variavel := func(param1,paramN) (tipo_retorno1,tipo_retornoN){
    //corpo
    return valor;
}

variavel := func(param1 tipo_param1, paramN tipo_paramN) : (nome_retorno1 tipo_retorno1, nome_retorno2 tipo_retornoN,...){
	//corpo
    return //retorno nomeado
}
Sintaxe: Uso
func_variavel(arg1,argN)
minha_variavel := func_variavel(arg1,argN)
minha_variavel1, minha_variavel2 := func_variavel(arg1,argN)
_, minha_variavel := func_variavel(arg1,argN)
minha_variavel := func_variavel(&arg1,&argN)
Onde
tipo_dado: tipo de dado do parâmetro
tipo_retorno: tipo de dado de retorno
nome_retorno1..N: Nome das variáveis para retorno
param1..N: lista de parâmetros separados por vírgula
arg1..N: lista de argumentos passados para a função
tipo_param1..N: tipo de dado do parâmetro
tipo_retorno1..N: tipo de dado do retorno da função
minha_variavel: variável que irá receber o retorno da função
Exemplo 1: Declaração e uso
package main
import "fmt"

func main() {
	funcao := func() {
		fmt.Printf("funcao literal")
	}
	funcao()
}
Saída
funcao literal
Exemplo 2: Uso de parâmetro e retorno
package main
import "fmt"

func main() {
	funcao := func(param int) {
		fmt.Println("funcao literal:",param)
	}
	funcao(2)
}
Saída
funcao literal: 2
Exemplo 3 : mais de um retorno
package main
import "fmt"

func main() {
	funcao := func(valor int) (int, int) {
		return valor * 2, valor * 3
	}

	var valor, valor2 = funcao(10)
	fmt.Printf("dobro:%d triplo:%d", valor, valor2)
}
Saída
dobro:20 triplo:30
Exemplo 4: Passagem por valor
package main
import "fmt"

func main() {
	funcao := func(valor int) {
		valor = valor * 2
	}
	valor := 10
	fmt.Printf("Antes: %d \n", valor)
	funcao(valor)
	fmt.Printf("Depois: %d", valor)
}
Saída
Antes: 10 
Depois: 10
Exemplo 5: Passagem por referência
package main
import "fmt"

func main() {

	funcao := func(param *int) {
		*param = 2
	}

	valor := 10
	fmt.Printf("Antes: %d \n", valor)
	funcao(&valor)
	fmt.Printf("Depois: %d", valor)
}
Saída
Antes: 10 
Depois: 2
Exemplo 6: mais de um retorno nomeado
package main
import "fmt"

func main() {

	funcao := func(valor int) (dobro int, triplo int) {
		dobro = valor * 2
		triplo = valor * 3

		return
	}

	var valor, valor2 = funcao(10)
	fmt.Printf("Val: %d %d", valor, valor2)
}
Saída
dobro:20 triplo:30
Exemplo 7: Usando identificador _
package main
import "fmt"

func main() {
	var valor int

	funcao := func(param int) (int, int) {
		return param * 2, param * 3
	}

	_, valor = funcao(10)
	fmt.Printf("%d \n", valor)
	valor, _ = funcao(10)
	fmt.Printf("%d", valor)
}
Saída
30
20
  1. 16/09/2024 - revisão 2 - Ajustes gramaticais
  2. 02/10/2023 - revisão 1 - Correção em referências, erros gramaticais e exemplo 2
  3. 21/08/2023 - versão inicial