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:
  1. A mensagem "Trabalho enviado: X" indica que cada trabalho foi enviado para o canal jobs na goroutine principal.
  2. As mensagens "Trabalho recebido: X" indicam que a goroutine trabalhadora recebeu e processou cada trabalho enviado.
  3. A mensagem "Todos os trabalhos enviados" é exibida após o fechamento do canal jobs na goroutine principal.
  4. 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. :)

Página principal do blog

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)