🚀 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
mainesperar 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).
- Como você chamaria essa função no modo normal (esperando ela terminar)?
- 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
- 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)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 06 Go_Naruto) 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_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:
baixarMusica("Linkin Park - In the End")go baixarMusica("Linkin Park - In the End")Gabarito da Prática 2:- 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.