Введение
Этот лаба旨在测试您对Go语言select
语句的了解,该语句允许您等待多个通道操作。
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
Этот лаба旨在测试您对Go语言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
для координации конкурентных горутин.