Sobes.tech
Middle

¿Qué se puede hacer con un canal cerrado en Go?

sobes.tech AI

Respuesta de la IA

Al leer desde un canal cerrado, se pueden obtener todos los datos restantes que se hayan escrito antes de cerrarlo. Después de que el canal se vacía, las operaciones de lectura posteriores devolverán un valor nulo del tipo del elemento del canal y el valor false como segundo valor devuelto, indicando que el canal está cerrado.

Al enviar datos a un canal cerrado, ocurrirá un pánico en tiempo de ejecución.

Al intentar cerrar un canal que ya está cerrado, también ocurrirá un pánico en tiempo de ejecución.

Se puede verificar si un canal está cerrado usando el operador ok al leer:

package main

import (
	"fmt"
)

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

	// Lectura desde un canal cerrado hasta que se vacía
	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

	// Lectura después de que el canal se vacía
	val3, ok3 := <-ch
	fmt.Printf("Valor: %d, Ok: %t\n", val3, ok3) // Valor: 0, Ok: false

	// Intentar enviar a un canal cerrado (esto causará un pánico)
	// ch <- 3 // Descomenta esta línea para causar un pánico

	// Intentar cerrar un canal ya cerrado (esto causará un pánico)
	// close(ch) // Descomenta esta línea para causar un pánico
}

Usar range con un canal cerrado permite leer datos secuencialmente hasta que el canal se vacía, momento en el cual el ciclo termina automáticamente.

package main

import (
	"fmt"
)

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

	// Uso de range con un canal cerrado
	for val := range ch {
		fmt.Println(val) // Imprimirá 10, luego 20
	}
}