🚀 Capítulo 04: A Origem das Funções (Tema: Inception)
NOTE
Este capítulo utiliza a temática de Inception (A Origem) para explicar as funções e os retornos múltiplos em Go. Aprenda a isolar a lógica do seu código em camadas!
1. 🎯 Objetivo da Aula
Compreender como criar e usar funções em Go, o recurso poderoso de Retornos Múltiplos e uma introdução ao conceito de Ponteiros.
2. 🏢 O Cenário Prático (Seu Desafio)
No filme Inception, a equipe de Dom Cobb cria níveis de sonhos dentro de sonhos para extrair segredos do subconsciente do alvo. Cada nível de sonho funciona como uma caixinha isolada: ela recebe alguns parâmetros (quem está sonhando, qual o cenário), executa uma ação complexa lá dentro e, no final, retorna um resultado para o nível acima (um segredo descoberto ou uma ideia plantada).
Na programação, as Funções são exatamente como esses níveis de sonho!
- Elas servem para isolar um bloco de código que resolve um problema específico.
- Você manda dados para dentro dela (Parâmetros), ela processa, e devolve a resposta (Retorno).
- E o Go tem um superpoder: uma função pode retornar várias respostas ao mesmo tempo! Seu desafio é criar a função perfeita!
🧠 Fundamentos: A Teoria Traduzida
📥 1. Criando uma Função Básica:
Usamos a palavra-chave func, damos um nome, definimos os parâmetros e o tipo do que ela vai devolver.
func somar(a int, b int) int {
return a + b
}📤 2. O Superpoder: Retornos Múltiplos
Em linguagens como Java ou C#, uma função só pode retornar uma única coisa. No Go, você pode retornar quantas quiser! Isso é muito usado para retornar o resultado E se aconteceu algum erro.
func dividir(dividendo, divisor float64) (float64, string) {
if divisor == 0 {
return 0, "Erro: Não posso dividir por zero!"
}
return dividendo / divisor, "Sucesso!"
}📍 3. Introdução a Ponteiros (O endereço da memória):
Normalmente, quando você passa uma variável para uma função, o Go tira uma cópia dela. O que acontecer lá dentro não muda a variável original do lado de fora.
- Se você quiser que a função mude a variável original, você passa o Ponteiro (o endereço de onde ela mora na memória) usando o símbolo
&.
4. 📖 Exemplo Guiado: A Função de Divisão
Vamos ver como capturar os dois retornos da função de divisão:
package main
import "fmt"
func dividir(a, b float64) (float64, string) {
if b == 0 {
return 0, "Erro"
}
return a / b, "OK"
}
func main() {
resultado, status := dividir(10, 2)
fmt.Println("Resultado:", resultado) // 5
fmt.Println("Status:", status) // OK
}5. 🛠️ Prática Obrigatória 1: Criando a sua Função
- Escreva uma função chamada
subtrairque receba dois números inteiros (aeb) e retorne a subtração deaporb. - Como você chamaria essa função dentro da função
mainpara subtrair de ?
6. 🛠️ Prática Obrigatória 2: Retornos Múltiplos
- Crie uma função chamada
dadosHeroique não recebe nenhum parâmetro, mas retorna duas strings: o nome do herói"Batman"e a cidade dele"Gotham". - Como você capturaria esses dois valores em duas variáveis diferentes dentro da função
main?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 04 Go_Inception) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
spec_backend_com_golang_e_gin/
├── capitulos/
│ └── capitulo_04_inception.md💡 Checkpoint de Lógica
Se uma função retorna dois valores, mas você só precisa de um deles, você pode usar o caractere _ (underline) para descartar o valor que você não quer! Ex: resultado, _ := dividir(10,2).
10. 🔥 Desafio de Fixação
Pesquise o que significa a palavra-chave defer em Go e como ela ajuda a fechar arquivos ou conexões de banco de dados automaticamente no final de uma função.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1: 1.
func subtrair(a int, b int) int {
return a - b
}resultado := subtrair(15, 10)Gabarito da Prática 2:
func dadosHeroi() (string, string) {
return "Batman", "Gotham"
}nome, cidade := dadosHeroi()