Sobes.tech
Junior — Middle

O que acontecerá primeiro: o processamento do sinal de cancelamento ou a finalização da gravação, se ocorrerem simultaneamente no canal?

sobes.tech IA

Resposta da IA

Em Go, ao tentar enviar um sinal de cancelamento (por exemplo, fechando um canal ou enviando um valor) e terminar a escrita num canal ao mesmo tempo, a ordem de processamento não é garantida e depende do agendador de goroutines e do estado dos canais. Os canais em Go sincronizam operações, mas se duas operações ocorrerem simultaneamente, uma delas será executada primeiro, embora isso não seja definido pela especificação.

Ou seja, se uma goroutine tenta escrever num canal, e outra goroutine fecha esse canal ou envia um sinal de cancelamento ao mesmo tempo, não se pode determinar qual operação será processada primeiro. É importante projetar a lógica de modo a não depender da ordem desses eventos simultâneos.

Exemplo:

cancel := make(chan struct{})
dados := make(chan int)

// Goroutine que escuta cancel
go func() {
    select {
    case <-cancel:
        fmt.Println("Cancelamento recebido")
    case v := <-dados:
        fmt.Println("Valor recebido", v)
    }
}()

// Envio simultâneo
close(cancel) // sinal de cancelamento
// ou
// dados <- 42 // escrita no canal

Neste exemplo, qual ramo será executado primeiro depende do agendador.