¿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
}
}