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