Capítulo 15: Concorrência (Goroutines e Channels) 👥🌀
Neste capítulo, vamos entrar no recurso mais famoso do Go: as Goroutines e os Canais (Channels). Vamos usar o tema de Clones de Sombra (Naruto)!
📖 O que são Goroutines?
Uma Goroutine é uma função que executa ao mesmo tempo que outras funções. Elas são como as Threads de outras linguagens, mas são extremamente leves (você pode rodar milhares delas ao mesmo tempo sem travar o PC!). Para criar uma, basta colocar a palavra go antes da chamada da função!
📖 O que são Channels (Canais)?
Se os clones estão trabalhando separados, eles precisam de uma forma de enviar mensagens de volta para o Naruto original. No Go, usamos os Channels para as Goroutines conversarem entre si com segurança!
📖 Exemplo Guiado: Clones Enviando Chakra
Vamos criar uma Goroutine (clone) que acumula chakra e envia para o Naruto original através de um canal.
- Crie o arquivo
clones_go.gona pastasrc/:
package main
import (
"fmt"
"time"
)
func acumularChakra(canal chan string) {
fmt.Println("Clone: Comecei a acumular chakra...")
time.Sleep(2 * time.Second) // Simula tempo de trabalho
// Enviando uma mensagem para o canal
canal <- "Chakra do Clone Recebido! 🌀"
}
func main() {
// Criando um canal de comunicação para strings
canalDeChakra := make(chan string)
// Iniciando a Goroutine (Clone de Sombra)
go acumularChakra(canalDeChakra)
fmt.Println("Naruto: Esperando o chakra do clone...")
// Recebendo a mensagem do canal (o programa pausa aqui até receber!)
mensagem := <-canalDeChakra
fmt.Println("Naruto:", mensagem)
}🕹️ Como Executar e Testar no VS Code
- Abra le terminal integrado.
- Execute:
go run clones_go.go
Resultado Esperado:
Naruto: Esperando o chakra do clone...
Clone: Comecei a acumular chakra...
Naruto: Chakra do Clone Recebido! 🌀📊 Ilustração Visual: Comunicação por Canal
Veja como os dados passam de uma goroutine para outra:
graph LR A["Goroutine: Clone"] -->|"canal <- 'Chakra'"| B((Canal)) B -->|"<- canal"| C["Goroutine: main (Naruto)"]
🛠️ Prática Obrigatória 1: Clones Cozinhando Lamen
Crie um programa chamado clones_lamen.go onde você cria uma Goroutine para “cozinhar o macarrão” e envia a mensagem “Macarrão pronto!” através de um canal para a função main. A main deve esperar essa mensagem e depois exibir “Lamen servido!“.
🔑 Gabarito de Código
Prática 1: clones_lamen.go
package main
import (
"fmt"
"time"
)
func cozinharMacarrao(c chan string) {
fmt.Println("Clone: Cozinhando o macarrao...")
time.Sleep(1 * time.Second)
c <- "Macarrao pronto!"
}
func main() {
canal := make(chan string)
go cozinharMacarrao(canal)
fmt.Println("Naruto: Esperando o macarrao...")
msg := <-canal
fmt.Println("Clone avisou:", msg)
fmt.Println("Naruto: Lamen servido! 🏆")
}