Ключовата дума select ни позволява да очакваме (и
приемаме) данни от много канали едновременно.
Съчетаването на канали и select ни дава много мощ.
import (
"fmt"
"time"
)
func main() {
За целите на нашия пример ще избираме от два канала.
c1 := make(chan string)
c2 := make(chan string)
Всеки канал получава някаква стойност след известно време. Така наподобяваме да речем RPC1 действия, изпълняващи се в различни едновременни гозадачи.
go func() {
time.Sleep(1 * time.Second)
c1 <- "едно"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "две"
}()
Използваме select, за да очакваме две стойности
едновременно, като извеждаме на екрана полученото
веднага щом пристигне някоя от тях.
for range 2 {
select {
case писмо1 := <-c1:
fmt.Println("получено", писмо1)
case писмо2 := <-c2:
fmt.Println("получено", писмо2)
}
}
}
Получаваме стойностите "едно" и после `“две”, както очакваме.
$ time go run select.go
получено едно
получено две
Забележете, че общото време за изпълнение е само около две секунди, а не три, тъй като заспиването за една и две секунди се изпълняват едновременно.
real 0m2.245s
Следващ пример: Срокове.