I've tried to adapt from from "Concurrency in Go by Katherine Cox-Buday" to understand how to apply timeout. But I don't get it. What I'm doing wrong? Here the code:
package main
import(
//"fmt"
"time"
"math/rand"
"log"
)
func main(){
// infinity loop
for{
log.Println("-----------------Start")
Task()
log.Println("-----------------End")
}
}
// Trying to adapt from Concurrency in Go by Katherine Cox-Buday
func Task(){
doWork := func( done <-chan interface{}, strings <-chan string, ) <-chan interface{} { //1
terminated := make(chan interface{})
go func() {
defer log.Println("doWork exited.")
defer close(terminated)
for {
goToSleep()
select {
//case s := <-strings:
// case s := ran():
// Do something interesting
//fmt.Println(s)
case <-done: //2
return
}
}
}()
}
done := make(chan interface{})
terminated := doWork(done, nil)
go func() { //3
// Cancel the operation after 3 second.
time.Sleep(3 * time.Second)
log.Println("Canceling doWork goroutine reach 3s...")
close(done)
}()
<-terminated //4
log.Println("Done.") }
}
func goToSleep(){
rand.Seed(time.Now().UnixNano())
n := rand.Intn(10)
log.Printf("Sleeping %d seconds....\n",n)
time.Sleep(time.Duration(n)*time.Second)
log.Println("Done sleeping!")
}