Демонстрация оператора select в Go

GolangGolangBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот лаба旨在测试您对Go语言select语句的了解,该语句允许您等待多个通道操作。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/select("Select") subgraph Lab Skills go/select -.-> lab-15503{{"Демонстрация оператора select в Go"}} end

Select

В этом лаба вам предоставлены два канала, c1 и c2, которые получат значение через некоторое время. Ваша задача - использовать select, чтобы одновременно ожидать обоих значений и выводить каждое при его получении.

  • Вы должны использовать оператор select, чтобы ожидать обоих каналов.
  • Вы должны выводить значение, полученное из каждого канала, при его получении.
## Мы получаем значения `"one"` и затем `"two"` как
## ожидается.
$ time go run select.go
получено one
получено two

## Обратите внимание, что общее время выполнения составляет всего ~2 секунды
## так как оба `Sleeps` на 1 и 2 секунды выполняются
## одновременно.
real 0m2.245s

Ниже представлен полный код:

// _select_ в Go позволяет ожидать нескольких операций с каналами.
// Комбинирование горутин и каналов с
// select - это мощный функционал Go.

package main

import (
	"fmt"
	"time"
)

func main() {

	// Для нашего примера мы будем выбирать между двумя каналами.
	c1 := make(chan string)
	c2 := make(chan string)

	// Каждый канал получит значение через некоторое время,
	// чтобы имитировать, например, блокирующие RPC - операции,
	// выполняющиеся в конкурентных горутинах.
	go func() {
		time.Sleep(1 * time.Second)
		c1 <- "one"
	}()
	go func() {
		time.Sleep(2 * time.Second)
		c2 <- "two"
	}()

	// Мы будем использовать `select`, чтобы одновременно ожидать обоих значений
	// и выводить каждое при его получении.
	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-c1:
			fmt.Println("получено", msg1)
		case msg2 := <-c2:
			fmt.Println("получено", msg2)
		}
	}
}

Резюме

Этот лаба проверяет вашу способность использовать оператор select в Go для ожидания нескольких операций с каналами. Завершив этот лаба, вы получите лучшее понимание того, как использовать select для координации конкурентных горутин.