package main import ( "fmt" "math/rand" "time" ) func init() { rand.Seed(time.Now().Unix()) } func SleepyGopher(id int, c chan int) { duration := time.Duration(rand.Intn(4000)) * time.Millisecond fmt.Printf("gopher %d sleep for %v\n", id, duration) time.Sleep(duration) c <- id } func main() { timeout := time.After(2 * time.Second) c := make(chan int, 5) /** Горутины для гоферов нужно создать заранее. Если делать это в for с select, то select будет блокировать дальнейшее исполнение и создание следующей горутины **/ for i := 0; i < 5; i++ { go SleepyGopher(i, c) } for i := 0; i < 5; i++ { select { case gopherID := <-c: // Ждет пока проснется гофер fmt.Println("gopher: ", gopherID, "has finished sleeping") case <-timeout: // Ждет окончания времени fmt.Println("my patience ran out\n") return } } }