🚀 Capítulo 06: Jutsu Clone das Sombras (Tema: Naruto)

NOTE

Este capítulo utiliza a temática de Naruto para explicar as Goroutines. Aprenda a executar várias tarefas ao mesmo tempo na velocidade da luz!


1. 🎯 Objetivo da Aula

Compreender o conceito de Goroutines, como o Go lida com a concorrência de forma ultra leve e como disparar funções em paralelo usando a palavra-chave go.

2. 🏢 O Cenário Prático (Seu Desafio)

No famoso anime Naruto, o ninja protagonista possui uma técnica chamada Jutsu Clone das Sombras (Tajuu Kage Bunshin no Jutsu). Ele consegue criar centenas de cópias idênticas de si mesmo. O mais legal é que cada clone pode realizar uma tarefa diferente ao mesmo tempo: um clone estuda história, outro treina golpes e outro limpa o quarto. No final, todo o conhecimento acumulado pelos clones volta para o Naruto original!

No desenvolvimento de software tradicional, fazer o computador realizar várias tarefas ao mesmo tempo (multitasking) é algo pesado e que consome muita memória.

  • Mas no Go, nós temos as Goroutines!
  • Elas são como os clones do Naruto: “threads” extremamente leves. Enquanto em linguagens como Java criar uma thread custa cerca de de memória, em Go uma goroutine custa apenas !
  • Você pode criar literalmente milhares de clones no Go sem travar o computador. Seu desafio é dominar esse jutsu!

🧠 Fundamentos: A Teoria Traduzida

👥 1. Concorrência vs Paralelismo:

  • Concorrência: É lidar com várias coisas ao mesmo tempo. Imagine um malabarista jogando várias bolas. Ele só toca em uma bola por vez, mas dá a impressão de estar lidando com todas juntas.
  • Paralelismo: É fazer várias coisas ao mesmo tempo. Imagine vários malabaristas, cada um jogando uma bola diferente ao mesmo tempo.

💨 2. Invocando uma Goroutine:

Para fazer uma função rodar em segundo plano (como um clone), basta colocar a palavra-chave go antes de chamar a função!

func treinar() {
    fmt.Println("Clone treinando...")
}
 
func main() {
    go treinar() // O clone começa a treinar em segundo plano!
    fmt.Println("Naruto original fazendo outra coisa...")
}
sequenceDiagram
    participant Main as Naruto Original (Main)
    participant Clone as Clone (Goroutine)
    
    Main->>Clone: go treinar() (Dispara Jutsu)
    activate Clone
    Note over Main: Continua fazendo outra coisa...
    Note over Clone: Treinando em segundo plano...
    Clone-->>Main: Termina o treino
    deactivate Clone

4. 📖 Exemplo Guiado: O Problema do Tempo

Se você rodar o código acima, é muito provável que a frase "Clone treinando..." não apareça na tela! Por quê?

  • As Goroutines são tão rápidas que a função main (o Naruto original) acaba e fecha o programa antes mesmo do clone ter tempo de começar a trabalhar!
  • Para resolver isso de forma simples (por enquanto), podemos fazer o main esperar um segundo antes de fechar:
package main
 
import (
    "fmt"
    "time"
)
 
func treinar() {
    time.Sleep(500 * time.Millisecond) // Simula um treino demorado
    fmt.Println("Clone terminou o treino!")
}
 
func main() {
    go treinar()
    fmt.Println("Naruto original esperando...")
    time.Sleep(1 * time.Second) // Dá tempo para o clone terminar!
}

5. 🛠️ Prática Obrigatória 1: Invocando o Clone

Imagine que você tem uma função chamada baixarMusica(nome string).

  1. Como você chamaria essa função no modo normal (esperando ela terminar)?
  2. Como você chamaria essa função usando uma Goroutine para que ela baixe a música em segundo plano enquanto o usuário continua mexendo no app?

6. 🛠️ Prática Obrigatória 2: O Custo da Memória

  1. Qual a principal vantagem das Goroutines do Go em relação às Threads tradicionais de outras linguagens de programação quando precisamos criar milhares de tarefas paralelas?

7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 06 Go_Naruto) 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_06_naruto.md

💡 Checkpoint de Lógica

Para sincronizar as goroutines de forma profissional (sem usar o time.Sleep), os programadores de Go usam uma ferramenta chamada sync.WaitGroup!

10. 🔥 Desafio de Fixação

Pesquise o que significa o termo Scheduler (Agendador) do Go e como ele distribui as goroutines pelos núcleos do processador do computador.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. baixarMusica("Linkin Park - In the End")
  2. go baixarMusica("Linkin Park - In the End") Gabarito da Prática 2:
  3. Elas são infinitamente mais leves! Elas consomem apenas cerca de de memória inicial cada uma, permitindo criar centenas de milhares delas simultaneamente, enquanto outras linguagens travariam o computador por falta de memória RAM ao tentar criar a mesma quantidade de Threads.

Capitulo Anterior | Proximo Capitulo