Demonstração da Instrução Select em Go

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório tem como objetivo testar seus conhecimentos sobre a instrução select do Go, que permite aguardar por múltiplas operações de canal.

Select (Seleção)

Neste laboratório, você recebe dois canais, c1 e c2, que receberão um valor após algum tempo. Sua tarefa é usar select para aguardar ambos os valores simultaneamente, imprimindo cada um conforme chega.

  • Você deve usar a instrução select para aguardar em ambos os canais.
  • Você deve imprimir o valor recebido de cada canal conforme ele chega.
## Recebemos os valores `"one"` e então `"two"` como
## esperado.
$ time go run select.go
received one
received two

## Observe que o tempo total de execução é de apenas ~2 segundos
## já que os `Sleeps` de 1 e 2 segundos executam
## concorrentemente.
real 0m2.245s

Aqui está o código completo:

// O _select_ do Go permite que você aguarde em múltiplas operações de canal.
// Combinar goroutines e canais com select é um recurso poderoso do Go.

package main

import (
	"fmt"
	"time"
)

func main() {

	// Para nosso exemplo, vamos selecionar em dois canais.
	c1 := make(chan string)
	c2 := make(chan string)

	// Cada canal receberá um valor após algum tempo, para simular, por exemplo,
	// operações RPC bloqueantes executando em goroutines concorrentes.
	go func() {
		time.Sleep(1 * time.Second)
		c1 <- "one"
	}()
	go func() {
		time.Sleep(2 * time.Second)
		c2 <- "two"
	}()

	// Usaremos `select` para aguardar ambos esses valores
	// simultaneamente, imprimindo cada um conforme chega.
	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-c1:
			fmt.Println("received", msg1)
		case msg2 := <-c2:
			fmt.Println("received", msg2)
		}
	}
}

Resumo

Este laboratório testa sua capacidade de usar a instrução select em Go para aguardar em múltiplas operações de canal. Ao concluir este laboratório, você obterá uma melhor compreensão de como usar select para coordenar goroutines concorrentes.