Junior — Middle
Como determinar qual das goroutines terminará com o canal?
sobes.tech IA
Resposta da IA
Em Go, não é possível determinar diretamente qual goroutine terminou com o canal, pois os canais não contêm informações sobre quem os fecha. No entanto, normalmente usa-se um acordo:
- A goroutine que escreve no canal é responsável por fechá-lo.
- As goroutines que leem recebem um sinal de encerramento através do segundo parâmetro na leitura:
value, ok := <-ch. Seok == false, o canal está fechado.
Para entender qual goroutine fechou o canal, pode-se usar mecanismos adicionais, como enviar mensagens estruturadas com identificadores pelo canal, ou usar canais de sinal separados ou contextos (context.Context) para coordenação.
Exemplo:
ch := make(chan int)
// Goroutine que escreve e fecha o canal
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine que lê
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Canal fechado")
}()
Neste exemplo, a primeira goroutine fecha o canal. Para saber explicitamente quem fechou o canal, pode-se adicionar logs ou usar canais adicionais para sinais.