Вот довольно полезный пример для игры. У меня есть дополнительные материалы для записи последовательностей, чтобы вы могли видеть, что все может закончиться не по порядку, но по-прежнему отображаться по порядку, как можно скорее, но не раньше, чем завершится предыдущий.
package main
import (
"fmt"
"math/rand"
"time"
)
func deferredString(lbl string, f func() string) (rv chan string) {
rv = make(chan string)
go func() {
s := f()
fmt.Printf("Finished %s\n", lbl)
rv <- s
}()
return rv
}
func do(rv string) string {
t := rand.Intn(5)
fmt.Printf("Sleeping for %d seconds for %s\n", t, rv)
time.Sleep(time.Duration(t) * time.Second)
return rv
}
func main() {
rand.Seed(int64(time.Now().Nanosecond()))
cha := deferredString("a", func() string { return do("a") })
chb := deferredString("b", func() string { return do("b") })
chc := deferredString("c", func() string { return do("c") })
fmt.Printf("a: %s\n", <-cha)
fmt.Printf("b: %s\n", <-chb)
fmt.Printf("c: %s\n", <-chc)
}