Sobes.tech
Middle

O que se pode fazer com um canal fechado em Go?

sobes.tech IA

Resposta da IA

Ao ler de um canal fechado, pode obter todos os dados restantes que foram escritos antes do fecho. Após o canal estar vazio, operações de leitura subsequentes devolverão um valor nulo do tipo do elemento do canal e o valor false como segundo valor de retorno, indicando que o canal está fechado.

Enviar dados para um canal fechado causará um pânico em tempo de execução.

Tentar fechar um canal já fechado também causará um pânico em tempo de execução.

Pode verificar se um canal está fechado usando o operador ok ao ler:

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 2)
	ch <- 1
	ch <- 2
	close(ch)

	// Leitura de um canal fechado até estar vazio
	val1, ok1 := <-ch
	fmt.Printf("Valor: %d, Ok: %t\n", val1, ok1) // Valor: 1, Ok: true

	val2, ok2 := <-ch
	fmt.Printf("Valor: %d, Ok: %t\n", val2, ok2) // Valor: 2, Ok: true

	// Leitura após o canal estar vazio
	val3, ok3 := <-ch
	fmt.Printf("Valor: %d, Ok: %t\n", val3, ok3) // Valor: 0, Ok: false

	// Tentar enviar para um canal fechado (isto causará um pânico)
	// ch <- 3 // Descomente esta linha para causar um pânico

	// Tentar fechar um canal já fechado (isto causará um pânico)
	// close(ch) // Descomente esta linha para causar um pânico
}

Usar range com um canal fechado permite ler dados sequencialmente até que o canal esteja vazio, momento em que o ciclo termina automaticamente.

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 3)
	ch <- 10
	ch <- 20
	close(ch)

	// Uso de range com um canal fechado
	for val := range ch {
		fmt.Println(val) // Vai imprimir 10, depois 20
	}
}