package main import . "fmt" import "os" import "strconv" func iter(b int, c chan int) { for i := 0; i < b; i++ { c <- i } close(c) } func main() { n, _ := strconv.Atoi(os.Args[1]) a := make(chan int) b := make(chan int) /* Queste due goroutine scrivono i primi n interi nei canali a e b. Il ciclo successivo legge i valori fino a che entrambi i canali non sono chiusi. Notate che per ottenere questo risultato controlliamo a ogni lettura che il canale non sia stato chiuso, e in tal caso lo mettiamo a nil, perché i canali a nil non restituiscono mai nulla, e quindi non vengono mai presi in considerazione dalla select. */ go iter(n, a) go iter(n, b) for a != nil || b != nil { select { case x, ok := <- a: if ok { Println(x) } else { a = nil } case y, ok := <- b: if ok { Println(y) } else { b = nil } } } }