Aula 28 – Tutorial Golang – Direção dos Canais
Aula 28 – Tutorial Golang – Direção dos Canais
Página principal do blog
Todas as aulas desse curso
Aula 27 Aula 29
Redes Sociais:
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Melhore seu NETWORKING
https://digitalinnovation.one/
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no https://github.com/toticavalcanti.
Código final da aula:
https://github.com/toticavalcanti
Canais do Youtube:
Toti
Backing Track / Play-Along
Código Fluente
Putz!
Vocal Techniques and Exercises
PIX para doações
Aula 28 – Tutorial Golang – Direção dos Canais
Fontes usadas para esse post:
- https://golangbyexample.com/channel-direction-go/
- https://blog.gopheracademy.com/advent-2019/directional-channels/
- https://golangr.com/channel-directions/
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. 🙂
Página principal do blog
Todas as aulas desse curso
Aula 27 Aula 29
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Obrigado e bons estudos. 😉