Aula 08 - Concorrência em Go ⚡
Objetivo
Objetivo: Entender o modelo de concorrência do Go baseado em Goroutines e Channels, aprendendo a criar programas que executam múltiplas tarefas simultaneamente.
1. Concorrência vs Paralelismo 🧩
- Concorrência: Lidar com muitas coisas ao mesmo tempo (composição de tarefas independentes).
- Paralelismo: Fazer muitas coisas ao mesmo tempo (execução simultânea em múltiplos núcleos).
Go foi desenhada para tornar a concorrência fácil e barata.
2. Goroutines: Threads Levíssimas 🪶
Uma Goroutine é uma função que executa de forma independente. Para iniciar uma, basta usar a palavra-chave go.
func dizer(s string) {
fmt.Println(s)
}
func main() {
go dizer("Olá") // Inicia em segundo plano
fmt.Println("Mundo")
}
Uma Goroutine consome apenas 2KB de memória inicial, permitindo rodar milhões delas em uma máquina comum!
3. Channels: A Comunicação Segura 📡
"Não comunique compartilhando memória; compartilhe memória comunicando."
Channels são os tubos que permitem às Goroutines trocarem dados de forma segura, sem precisar de travas (locks) complexas.
canal := make(chan string)
go func() {
canal <- "Dados enviados!" // Envia
}()
msg := <-canal // Recebe (bloqueia até chegar algo)
4. O Select: Um Switch para Canais 🚦
O select permite que uma Goroutine espere por múltiplas operações de comunicação.
select {
case msg1 := <-c1:
fmt.Println("Recebi de c1:", msg1)
case msg2 := <-c2:
fmt.Println("Recebi de c2:", msg2)
case <-time.After(time.Second):
fmt.Println("Timeout! ⏰")
}
5. Visualização de Canais (Mermaid) 📊
graph LR
subgraph "Goroutine 1"
G1[Processo A]
end
subgraph "Canal"
CH((Channel))
end
subgraph "Goroutine 2"
G2[Processo B]
end
G1 -->|Envia dado| CH
CH -->|Recebe dado| G2
6. Mini-Projeto: Web Crawler Básico 🚀
Crie um programa que receba um slice de 5 URLs e:
1. Dispare uma Goroutine para cada URL.
2. Cada Goroutine deve imprimir o tempo que levou para "acessar" aquela URL (use time.Sleep para simular).
3. Use um canal ou WaitGroup para garantir que o main espere todas terminarem.
7. Exercícios de Fixação 🧠
- O que acontece se você enviar um dado para um canal e ninguém estiver lendo? (Deadlock!)
- Qual a diferença de memória entre uma Thread comum (OS) e uma Goroutine?
- Para que serve um "Buffered Channel"?
Próxima Aula: Iniciaremos o Módulo 3 com Programação Web e net/http! 🌐🐹