Aula 28 - Tutorial Golang - Direção dos Canais
Fontes usadas para esse post:
Combinados com
goroutines, os
canais formam a espinha dorsal do modelo de simultaneidade inspirado em
CSP(Communicating sequential processes) do
Go.
Eles são simples e expressivos, mas, podem ser difíceis de usar adequadamente, especialmente se você precisar controlar quem pode ler ou escrever neles.
É possível criar
canais bidirecionais e
unidirecionais em
Go.
Pode-se criar um canal para o qual só podemos enviar dados, assim como pode ser criado um canal do qual só podemos receber dados.
Isso é determinado pela direção da seta do canal.
A direção da seta para um canal especifica a direção do fluxo de dados.
- chan : canal bidirecional (ambos lê e escreve)
- chan<- : só escreve no canal (seta a direita)
- <-chan : só ler do canal(seta a esquerda)
Essa especificidade aumenta a segurança de tipo do programa.
Exemplo
No código abaixo, a função de
ping() aceita apenas um canal para envio de valores.
Se você tentar receber alguma coisa nesse canal, vai dá um erro de compilação, faça o teste descomentando a linha
//pings <- "Hi, testing" no código abaixo.
invalid operation: cannot send to receive-only channel pings (variable of type <-chan string)compilerInvalidSend
A função
pong() aceita um canal para recebimentos (
pings) e a palavra
chan está a
direita da
seta(<-chan string), e um segundo para envios (
pongs), a palavra
chan está a
esquerda da
seta(chan<-).
// When using channels as function parameters, you can
// specify if a channel is meant to only send or receive
// values. This specificity increases the type-safety of
// the program.
package main
import "fmt"
func ping(pings chan<- string, msg string) {
//put the received message in the pings channel output
pings <- msg
}
func pong(pings <-chan string, pongs chan<- string) {
//read the message that was passed to pings channel and assign to msg
msg := <-pings
//put the msg content in the pongs channel output
pongs <- msg
//pings <- "Trying send message to pings channel"
}
func main() {
pings := make(chan string, 1)
pongs := make(chan string, 1)
//call ping function passing pings channel to it
ping(pings, "Sending message to the pings channel")
//read message from pings channel inside pong function
pong(pings, pongs)
//print the output from pongs channel
fmt.Println(<-pongs)
}
Executando o código com: go run channel_directions.go
Temos a seguinte saída: Sending message to the pings channel
É isso pessoal, fico por aqui!
Até mais. :)
Meus links de afiliados:
Obrigado e bons estudos. ;)