Passando funções em Go: do iniciante ao profissional em 15 minutos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

É possível passar uma função como parâmetro? Sim, e é por isso que isso muda tudo

\n\n

Você já se perguntou se é possível em Go passar uma função dentro de outra, como uma variável comum? Se você vem do mundo Python ou JavaScript, isso é um padrão familiar para você. Mas em Go, apesar de toda a sua rigidez, funções como parâmetros não é apenas "possível", é uma das ferramentas mais poderosas da linguagem.

\n\n

Lembro-me da minha primeira experiência com esse conceito: eu estava escrevendo um utilitário para processar logs e percebi que estava copiando e colando o mesmo loop com lógica diferente internamente. A solução veio quando percebi que podia simplesmente passar a função desejada como argumento. O código ficou mais limpo, mais curto e mais compreensível. Neste artigo, mostrarei como dominar a passagem de função para função em Go — desde exemplos simples até padrões reais que você poderá usar amanhã no trabalho.

\n\n

A propósito, no PythonLib vemos frequentemente perguntas como "Can functions be passed as parameters?" no Stack Overflow com milhares de visualizações. Vamos de uma vez por todas analisar este tópico usando Go como exemplo.

\n\n

O que são funções como parâmetros em Go?

\n\n

Em Go, funções são objetos de primeira classe. Isso significa que elas podem ser:

\n
    \n
  • Atribuídas a variáveis
  • \n
  • Passadas para outras funções
  • \n
  • Retornadas de funções
  • \n
  • Armazenadas em structs e slices
  • \n
\n\n

Quando falamos sobre função como parâmetro, queremos dizer que uma função recebe outra função como argumento e a chama internamente. Parece complicado? Na verdade, é mais simples do que parece.

\n\n

Sintaxe: como declarar uma função que recebe outra função

\n\n

Em Go, é necessário especificar explicitamente o tipo da função-parâmetro. Fica assim:

\n\n
// Declarando um tipo de função\ntype Transformer func(string) string\n\n// Função que recebe outra função\nfunc processText(text string, transform Transformer) string {\n    return transform(text)\n}
\n\n

Ou você pode declarar o tipo diretamente na assinatura:

\n\n
func processText(text string, transform func(string) string) string {\n    return transform(text)\n}
\n\n

Ambas as opções funcionam. A primeira é mais conveniente se você planeja reutilizar o tipo. A segunda é para soluções rápidas.

\n\n

Exemplo simples: passando uma função de saudação

\n\n

Vamos escrever algo prático. Imagine que você tem uma função que formata o nome do usuário e deseja usar diferentes saudações:

\n\n
package main\n\nimport "fmt"\n\n// Tipo para a função de saudação\ntype Greeter func(name string) string\n\n// Função que recebe a saudação\nfunc greetUser(name string, greeter Greeter) {\n    message := greeter(name)\n    fmt.Println(message)\n}\n\nfunc main() {\n    // Saudação normal\n    normalGreet := func(name string) string {\n        return "Olá, " + name + "!"\n    }\n\n    // Saudação formal\n    formalGreet := func(name string) string {\n        return "Prezado(a) " + name + ", boa tarde."\n    }\n\n    greetUser("Ana", normalGreet)\n    greetUser("Ana", formalGreet)\n}
\n\n

Saída:

\n
Olá, Ana!\nPrezado(a) Ana, boa tarde.
\n\n

Viu? Simplesmente passamos funções diferentes para a mesma greetUser. Isso é a passagem de função como argumento em ação.

\n\n

Funções Callback: quando é necessário processar o resultado

\n\n

Um dos cenários mais comuns de uso de funções como parâmetros são os callbacks. Você executa alguma operação e chama a função passada quando a operação é concluída.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\n// Função que simula um carregamento demorado de dados\nfunc fetchData(callback func(string)) {\n    fmt.Println("Carregando dados...")\n    time.Sleep(2 * time.Second) // Simulação de atraso\n    data := "Dados importantes do banco"\n    callback(data)                

Blogs

Book Recommendations