| f("hello", "world") // f runs; we wait | |
| go f("hello", "world") // f starts running | |
| g() // does not wait for f to return | |
| timerChan := make(chan time.Time) | |
| go func() { | |
| time.Sleep(deltaT) | |
| timerChan <- time.Now() // send time on timerChan | |
| }() | |
| // Do something else; when ready, receive. | |
| // Receive will block until timerChan delivers. | |
| // Value sent is other goroutine's completion time. | |
| completedAt := <-timerChan | |
| select { | |
| case v := <-ch1: | |
| fmt.Println("channel 1 sends", v) | |
| case v := <-ch2: | |
| fmt.Println("channel 2 sends", v) | |
| default: // optional | |
| fmt.Println("neither channel was ready") | |
| } | |
| func Query(conns []Conn, query string) Result { | |
| ch := make(chan Result, len(conns)) // buffered | |
| for _, conn := range conns { | |
| go func(c Conn) { | |
| ch <- c.DoQuery(query): | |
| }(conn) | |
| } | |
| return <-ch | |
| } | |
| func XQuery(conns []Conn, query string) Result { | |
| ch := make(chan Result, 1) // buffer of 1 item | |
| for _, conn := range conns { | |
| go func(c Conn) { | |
| select { | |
| case ch <- c.DoQuery(query): | |
| // nothing to do | |
| default: // executes if ch is blocked | |
| // nothing to do | |
| } | |
| }(conn) | |
| } | |
| return <-ch | |
| } | |
| func Compose(f, g func(x float) float) | |
| func(x float) float { | |
| return func(x float) float { | |
| return f(g(x)) | |
| } | |
| } | |
| print(Compose(sin, cos)(0.5)) | |
| go func() { // copy input to output | |
| for val := range input { | |
| output <- val | |
| } | |
| }() |