Introdução
Este laboratório visa testar sua compreensão das operações de canal não bloqueantes em Golang. Você será solicitado a implementar envios (sends) e recebimentos (receives) não bloqueantes, e seleções multi-vias usando a instrução select com uma cláusula default.
Operações de Canal Não Bloqueantes
O problema a ser resolvido neste laboratório é implementar operações de canal não bloqueantes usando a instrução select com uma cláusula default.
- Implementar um recebimento (receive) não bloqueante em um canal usando a instrução
selectcom uma cláusuladefault. - Implementar um envio (send) não bloqueante em um canal usando a instrução
selectcom uma cláusuladefault. - Implementar uma seleção (select) multi-vias não bloqueante usando a instrução
selectcom múltiplas cláusulascasee uma cláusuladefault.
$ go run non-blocking-channel-operations.go
no message received
no message sent
no activity
A seguir, o código completo:
// Envios (sends) e recebimentos (receives) básicos em canais são bloqueantes.
// No entanto, podemos usar `select` com uma cláusula `default` para
// implementar envios (sends), recebimentos (receives) e até mesmo
// `select`s multi-vias _não bloqueantes_.
package main
import "fmt"
func main() {
messages := make(chan string)
signals := make(chan bool)
// Aqui está um recebimento (receive) não bloqueante. Se um valor estiver
// disponível em `messages`, então `select` tomará
// o `<-messages` `case` com esse valor. Se não,
// ele imediatamente tomará o `default` case.
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
// Um envio (send) não bloqueante funciona de forma semelhante. Aqui `msg`
// não pode ser enviado para o canal `messages`, porque
// o canal não tem buffer e não há receptor.
// Portanto, o `default` case é selecionado.
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
// Podemos usar múltiplos `case`s acima do `default`
// clause para implementar um `select` multi-vias não bloqueante.
// Aqui tentamos recebimentos (receives) não bloqueantes
// em `messages` e `signals`.
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
Resumo
Neste laboratório, você aprendeu como implementar operações de canal não bloqueantes usando a instrução select com uma cláusula default. Você implementou um recebimento (receive) não bloqueante, um envio (send) não bloqueante e uma seleção (select) multi-vias não bloqueante.