Введение
Этот лаба旨在测试您对 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 для координации конкурентных горутин.