Canais Unidirecionais
Por padrão, um canal é bidirecional e pode ser lido ou escrito. Às vezes, precisamos restringir o uso de um canal, por exemplo, queremos garantir que um canal só possa ser escrito ou só possa ser lido dentro de uma função. Como podemos conseguir isso?
Podemos declarar explicitamente um canal com uso restrito antes de inicializá-lo.
Canal Somente Escrita (Write-only Channel)
Um canal somente escrita significa que, dentro de uma função específica, o canal só pode ser escrito e não pode ser lido. Vamos declarar e usar um canal somente escrita do 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)
}
Execute o programa usando o seguinte comando:
go run channel.go
A saída do programa é a seguinte:
Data written to channel
Data received: 10
Neste exemplo, a função writeOnly restringe o canal apenas à escrita.
Canal Somente Leitura (Read-only Channel)
Um canal somente leitura significa que, dentro de uma função específica, o canal só pode ser lido e não pode ser escrito. Vamos declarar e usar um canal somente leitura do 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)
}
Execute o programa usando o seguinte comando:
go run channel.go
A saída do programa é a seguinte:
Data received from channel: 20
Neste exemplo, a função readOnly restringe o canal apenas à leitura.
Combinando Canais Somente Escrita e Somente Leitura
Você pode combinar canais somente escrita e somente leitura para demonstrar como os dados fluem através de canais restritos:
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)
}
Execute o programa usando o seguinte comando:
go run channel.go
A saída do programa é a seguinte:
Data written to channel
Data received from channel: 30
Este exemplo ilustra como um canal somente escrita pode passar dados para um canal somente leitura.