From 25645dbc44db7fe66503899e09037aa83430ad04 Mon Sep 17 00:00:00 2001 From: Khaled Hammouda Date: Thu, 27 May 2021 05:47:13 -0400 Subject: [PATCH] docs: fix channel select example (#10213) --- doc/docs.md | 63 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/doc/docs.md b/doc/docs.md index 7c7612ac0a..4a05446cb2 100644 --- a/doc/docs.md +++ b/doc/docs.md @@ -2885,29 +2885,48 @@ y := <-ch2 ? The `select` command allows monitoring several channels at the same time without noticeable CPU load. It consists of a list of possible transfers and associated branches of statements - similar to the [match](#match) command: -```v wip +```v import time -fn main () { - c := chan f64{} - ch := chan f64{} - ch2 := chan f64{} - ch3 := chan f64{} - mut b := 0.0 - // ... - select { - a := <-ch { - // do something with `a` - } - b = <-ch2 { - // do something with predeclared variable `b` - } - ch3 <- c { - // do something if `c` was sent - } - > 500 * time.millisecond { - // do something if no channel has become ready within 0.5s - } - } + +fn main() { + ch := chan f64{} + ch2 := chan f64{} + ch3 := chan f64{} + mut b := 0.0 + c := 1.0 + // ... setup go threads that will send on ch/ch2 + go fn (the_channel chan f64) { + time.sleep(5 * time.millisecond) + the_channel <- 1.0 + }(ch) + go fn (the_channel chan f64) { + time.sleep(1 * time.millisecond) + the_channel <- 1.0 + }(ch2) + go fn (the_channel chan f64) { + _ := <-the_channel + }(ch3) + // + select { + a := <-ch { + // do something with `a` + eprintln('> a: $a') + } + b = <-ch2 { + // do something with predeclared variable `b` + eprintln('> b: $b') + } + ch3 <- c { + // do something if `c` was sent + time.sleep(5 * time.millisecond) + eprintln('> c: $c was send on channel ch3') + } + > 500 * time.millisecond { + // do something if no channel has become ready within 0.5s + eprintln('> more than 0.5s passed without a channel being ready') + } + } + eprintln('> done') } ```