Sobes.tech
Junior — Middle

Como implementar uma leitura segura de dados de um canal em várias goroutines ao mesmo tempo?

sobes.tech IA

Resposta da IA

Em Go, para ler de um canal de forma segura a partir de várias goroutines ao mesmo tempo, geralmente utilizam-se uma das seguintes abordagens:

  1. Um emissor, vários receptores — o canal é criado e várias goroutines leem dele. O canal em Go é seguro para leitura simultânea de várias goroutines, portanto, basta lançar várias goroutines que leem de um mesmo canal.

  2. Uso de sync.WaitGroup para sincronização — para esperar que todas as goroutines terminem.

Exemplo:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Trabalhador %d recebeu %d\n", id, val)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup

    // Lançamos 3 goroutines que leem do canal
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Enviamos dados ao canal
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Fechamos o canal para que as goroutines terminem

    wg.Wait() // Esperamos que todas as goroutines terminem
}

Dessa forma, o canal em Go já garante acesso seguro ao ler de várias goroutines, o principal é gerenciar corretamente seu ciclo de vida e fechar o canal.