Aula 32 - Tutorial Golang - Fechamento de Canais em Go
Fechamento de Canais em Go - Comunicação e Finalização
1. Introdução:
Nesta aula, vamos explorar o conceito de
fechamento de canais em Go e entender como ele é usado para indicar a
finalização do
trabalho e
comunicar essa
informação às
goroutines.
O
fechamento de canais é uma técnica importante para
sincronização e
comunicação entre
goroutines em Go.
2. Canais em Go:
Antes de discutirmos o
fechamento de canais, vamos revisar brevemente o conceito de
canais em Go.
Os canais são uma construção poderosa que permitem a comunicação segura e a sincronização entre
goroutines.
Eles são usados para enviar e receber valores entre as goroutines.
3. Fechamento de Canais:
O
fechamento de canais é uma maneira de indicar que
não serão mais enviados valores através do canal.
Quando um canal é fechado, os receptores podem detectar esse fechamento e agir de acordo.
O fechamento de canais é útil para comunicar a conclusão do trabalho ou para indicar que não há mais valores a serem esperados.
4. Exemplo Prático:
Aqui está um exemplo prático que demonstra o fechamento de canais em ação:
package main
import "fmt"
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("Trabalho recebido:", j)
} else {
fmt.Println("Todos os trabalhos recebidos")
done <- true
return
}
}
}()
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("Trabalho enviado:", j)
}
close(jobs)
fmt.Println("Todos os trabalhos enviados")
<-done
}
Neste exemplo, criamos dois canais:
jobs e
done.
O canal
jobs é usado para enviar trabalhos da goroutine principal para a goroutine trabalhadora, enquanto o canal
done é usado para sincronizar a finalização da goroutine trabalhadora.
A goroutine trabalhadora recebe trabalhos do canal
jobs usando um loop infinito.
Se o canal estiver aberto e houver trabalhos disponíveis, a goroutine trabalhadora recebe e processa esses trabalhos.
Caso contrário, se o canal estiver fechado, a goroutine trabalhadora imprime "
Todos os trabalhos recebidos" e envia um valor verdadeiro para o canal
done para indicar sua conclusão.
Na goroutine principal, enviamos três trabalhos para o canal
jobs usando um loop
for.
Em cada iteração, é enviado o trabalho atual e exibimos uma mensagem indicando que o trabalho foi enviado.
Após o envio de todos os trabalhos, fechamos o canal
jobs usando a função
close()
Aqui está a saída esperada ao executar o exemplo:
Trabalho enviado: 1
Trabalho enviado: 2
Trabalho enviado: 3
Todos os trabalhos enviados
Trabalho recebido: 1
Trabalho recebido: 2
Trabalho recebido: 3
Todos os trabalhos recebidos
Explicação da saída:
- A mensagem "Trabalho enviado: X" indica que cada trabalho foi enviado para o canal
jobs na goroutine principal.
- As mensagens "Trabalho recebido: X" indicam que a goroutine trabalhadora recebeu e processou cada trabalho enviado.
- A mensagem "Todos os trabalhos enviados" é exibida após o fechamento do canal
jobs na goroutine principal.
- A mensagem "Todos os trabalhos recebidos" é exibida quando a goroutine trabalhadora detecta o fechamento do canal e conclui o processamento de todos os trabalhos.
Essa saída demonstra a comunicação entre as goroutines, o fechamento do canal
jobs após o envio de todos os trabalhos e a indicação de conclusão através do canal
done.
Eu fico por aqui e agradeço a você pela audiência.
Até mais. :)
Meus links de afiliados:
Obrigado e bons estudos. ;)