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.

  1. Crie o arquivo clones_go.go na pasta src/:
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

  1. Abra le terminal integrado.
  2. 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! 🏆")
}

Capitulo Anterior | Proximo Capitulo