// ========================================================================== // $Id: selectchannel.go,v 1.1 2015/04/03 21:51:31 jlang Exp $ // CSI2120 GO: Concurrency // ========================================================================== // (C)opyright: // // Jochen Lang // EECS, University of Ottawa // 800 King Edward Ave. // Ottawa, On., K1N 6N5 // Canada. // http://www.eecs.uottawa.ca // // Creator: Jochen Lang // Email: jlang@eecs.uottawa.ca // ========================================================================== // $Log: selectchannel.go,v $ // Revision 1.1 2015/04/03 21:51:31 jlang // Added some more detailed examples on go channels // // ========================================================================== package main import ( "fmt" "runtime" "time" ) func main() { runtime.GOMAXPROCS(3) cities := []string{"Ottawa", "Toronto", "Gatineau", "Casselman"} countries := []string{"Canada", "US", "Mexico", "China", "Australia"} ch1 := sendString(cities, 150) ch2 := sendString(countries, 200) outOfHere := time.NewTimer(time.Millisecond * 350) Forever: for { select { case str, ok := <-ch1: if !ok { break Forever } fmt.Printf("%s \n", str) case str, ok := <-ch2: if !ok { break Forever } fmt.Printf("%s \n", str) case <-outOfHere.C: fmt.Printf("Time is up\n") break Forever } } } func sendString(strArr []string, d int) chan string { ch := make(chan string) go func(d int) { // start a lambda in a go routine for _, s := range strArr { ch <- s time.Sleep(time.Duration(d) * time.Millisecond) } close(ch) }(d) return ch }