Canales Unidireccionales
Por defecto, un canal es bidireccional y se puede leer o escribir en él. A veces, necesitamos restringir el uso de un canal; por ejemplo, queremos asegurar que un canal solo pueda ser escrito o solo pueda ser leído dentro de una función. ¿Cómo podemos lograr esto?
Podemos declarar explícitamente un canal con uso restringido antes de inicializarlo.
Canal de Solo Escritura (Write-only Channel)
Un canal de solo escritura significa que, dentro de una función particular, solo se puede escribir en el canal y no se puede leer desde él. Declararemos y usaremos un canal de solo escritura de tipo int:
package main
import "fmt"
func writeOnly(ch chan<- int) {
ch <- 10
fmt.Println("Data written to channel")
}
func main() {
ch := make(chan int, 1)
writeOnly(ch)
fmt.Println("Data received:", <-ch)
}
Ejecute el programa usando el siguiente comando:
go run channel.go
La salida del programa es la siguiente:
Data written to channel
Data received: 10
En este ejemplo, la función writeOnly restringe el canal solo a la escritura.
Canal de Solo Lectura (Read-only Channel)
Un canal de solo lectura significa que, dentro de una función particular, solo se puede leer desde el canal y no se puede escribir en él. Declararemos y usaremos un canal de solo lectura de tipo int:
package main
import "fmt"
func readOnly(ch <-chan int) {
fmt.Println("Data received from channel:", <-ch)
}
func main() {
ch := make(chan int, 1)
ch <- 20
readOnly(ch)
}
Ejecute el programa usando el siguiente comando:
go run channel.go
La salida del programa es la siguiente:
Data received from channel: 20
En este ejemplo, la función readOnly restringe el canal solo a la lectura.
Combinación de Canales de Solo Escritura y Solo Lectura
Puede combinar canales de solo escritura y solo lectura para demostrar cómo fluyen los datos a través de canales restringidos:
package main
import "fmt"
func writeOnly(ch chan<- int) {
ch <- 30
fmt.Println("Data written to channel")
}
func readOnly(ch <-chan int) {
fmt.Println("Data received from channel:", <-ch)
}
func main() {
ch := make(chan int, 1)
writeOnly(ch)
readOnly(ch)
}
Ejecute el programa usando el siguiente comando:
go run channel.go
La salida del programa es la siguiente:
Data written to channel
Data received from channel: 30
Este ejemplo ilustra cómo un canal de solo escritura puede pasar datos a un canal de solo lectura.