Demostración de la instrucción select de Go

GolangGolangBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este laboratorio tiene como objetivo probar sus conocimientos sobre la instrucción select de Go, que le permite esperar en múltiples operaciones de canal.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/select("Select") subgraph Lab Skills go/select -.-> lab-15503{{"Demostración de la instrucción select de Go"}} end

Select

En este laboratorio, se le dan dos canales, c1 y c2, que recibirán un valor después de cierto tiempo. Su tarea es usar select para esperar simultáneamente ambos valores, imprimiendo cada uno a medida que llega.

  • Debe usar la instrucción select para esperar en ambos canales.
  • Debe imprimir el valor recibido de cada canal a medida que llega.
## Recibimos los valores `"uno"` y luego `"dos"` como
## se esperaba.
$ time go run select.go
recibido uno
recibido dos

## Tenga en cuenta que el tiempo total de ejecución es solo ~2 segundos
## ya que las dos `Sleeps` de 1 y 2 segundos se ejecutan
## concurrentemente.
real 0m2.245s

A continuación está el código completo:

// La _select_ de Go le permite esperar en múltiples operaciones de canal.
// Combinar gorutinas y canales con
// select es una característica poderosa de Go.

package main

import (
	"fmt"
	"time"
)

func main() {

	// Para nuestro ejemplo, seleccionaremos entre dos canales.
	c1 := make(chan string)
	c2 := make(chan string)

	// Cada canal recibirá un valor después de cierto tiempo, para simular, por ejemplo,
	// operaciones RPC bloqueantes que se ejecutan en gorutinas concurrentes.
	go func() {
		time.Sleep(1 * time.Second)
		c1 <- "uno"
	}()
	go func() {
		time.Sleep(2 * time.Second)
		c2 <- "dos"
	}()

	// Usaremos `select` para esperar simultáneamente ambos valores
	// e imprimir cada uno a medida que llega.
	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-c1:
			fmt.Println("recibido", msg1)
		case msg2 := <-c2:
			fmt.Println("recibido", msg2)
		}
	}
}

Resumen

Este laboratorio prueba su capacidad para usar la instrucción select en Go para esperar en múltiples operaciones de canal. Al completar este laboratorio, comprenderá mejor cómo usar select para coordinar gorutinas concurrentes.