Função no Go

Função com 1 tipo de retorno

Sintaxe

func [nome da função]([parâmetros...]) [tipo de retorno] {
  // Código ...
 
  return [retorno]
}

Exemplo

func Soma(a int, b int) int {
  return a + b
}

Função com múltiplos tipos de retorno

Sintaxe

func [nome da função]([parâmetros...]) ([tipos de retorno... (separados por vírgula)]) {
  // Código ...
 
  return [retornos...]
}

Geralmente, esse tipo função retorno 1 ou + valor(es) e 1 possível erro

Exemplo

func Soma(a int, b int) (int, error) {
  if a < 0 && b < 0 {
    return 0, errors.New("Número negativo")
  }
 
  return a + b, nil
}

Funções anônimas

Sintaxe

func ([parâmetros...]) [tipo de retorno] {
  // Código ...
 
  return [retorno]
}

Exemplo

anonymousFunction := func() int {
    return 1
}
 
fmt.Println(anonymousFunction()) // 1

Funções anônimas encadeadas

Sintaxe

resultado := func(x ...int) func() int {
  	result := 0
  	
  	for _, value := range x {
  		result += value
  	}
  	
  	return func() int {
  		return result * result
  	}
  }
 

No caso acima, a função anônima retora uma outra função (func() int).

fmt.Println(resultado(10, 10, 10)) // 0x497860

Ao chamar apenas a 1º função (1º par de parênteses), será impresso a referência dela.

fmt.Println(resultado(10, 10, 10)()) // 900

Para imprimir o resultado da 2º função é necessário também encadear as invocações de cada função ((...)(...)).

resultado(10, 10, 10)()

A sintaxe acima, pode parecer estranho, mas ela é composta pelos seguintes passos

[nome da variável]([argumentos da 1º função])([argumentos da 2º função])

[nome da variável] é a variável que armazena a função anônima encadeada.

Função variadic (...)

Definição

Aceita infinitos argumentos.

Em outras linguagens de programação é dado o nome de varargs.

IMPORTANTE

O operador ... deve ser o último parâmetro da função/método

  • Forma errada

    func main() {
      fmt.Println(Somar(1, 2, 3, 4, 5, 6, 7, 8, "ola"))
    }
     
    func Somar(valores ...int, a string) (int, string) {
      resultado := 0
     
      for _, value := range valores {
        resultado += value
      }
     
      return resultado, a
    }
  • Forma certa

    func main() {
      fmt.Println(Somar("Resultado:", 1, 2, 3, 4, 5, 6, 7, 8))
    }
     
    func Somar(a string, valores ...int) (string, int) {
        resultado := 0
     
        for _, value := range valores {
          resultado += value
        }
     
        return a, resultado
    }

Exemplo

func main() {
  result := somaTudo(1,2, 3, 4, 5, 6, 7, 8, 9, 10)
 
  fmt.Println(result)
}
 
func somaTudo(x ...int) int {
  resultado := 0
 
  for _, value := range x {
    resultado += value
  }
 
  return resultado
}

Importar funções

Sintaxe

import "[nome do projeto]/[pacotes]/..."

Exemplo

package math
 
func Soma(a int, b int) int {
    return a + b
}
package main
 
import (
  "fmt"
  "variaveis-tipos-e-pacotes/math"
)
 
func main() {
  resultado := math.Soma(1, 1)
  fmt.Printf(resultado) // 2
}