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. :)

Página principal do blog

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)