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

Beginner

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

Введение

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

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 для координации конкурентных горутин.