🚀 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

  1. Escreva uma função chamada subtrair que receba dois números inteiros (a e b) e retorne a subtração de a por b.
  2. Como você chamaria essa função dentro da função main para subtrair de ?

6. 🛠️ Prática Obrigatória 2: Retornos Múltiplos

  1. Crie uma função chamada dadosHeroi que não recebe nenhum parâmetro, mas retorna duas strings: o nome do herói "Batman" e a cidade dele "Gotham".
  2. 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)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 04 Go_Inception) e clique em Commit to main.
  2. 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
}
  1. resultado := subtrair(15, 10) Gabarito da Prática 2:
func dadosHeroi() (string, string) {
    return "Batman", "Gotham"
}
  1. nome, cidade := dadosHeroi()

Capitulo Anterior | Proximo Capitulo