// ========================================================================== // $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" "time" "runtime" ) 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 }