Il pacchetto time fornisce due strumenti utili: Timer e Ticker.
Differenze chiave:
Timer dopo l'attivazione "si spegne", deve essere ripristinato (Reset) per essere utilizzato di nuovo.Ticker genera eventi finché non viene esplicitamente fermato con il metodo Stop().Caratteristiche d’uso:
Stop() su Timer/Ticker al termine dell'uso per evitare perdite di risorse.Stop() su un Timer, potrebbe essere necessario "svuotare" il canale: se il timer è scattato prima di Stop(), è obbligatorio leggere dal canale.Esempio di utilizzo corretto di Timer:
t := time.NewTimer(2 * time.Second) defer t.Stop() // obbligatorio! select { case <-t.C: fmt.Println("Il tempo è scaduto!") case <-otherDone: if !t.Stop() { <-t.C // svuota il canale se necessario } }
È possibile riutilizzare immediatamente un Timer dopo aver ricevuto un valore dal canale t.C? Cosa succede se non si chiama t.Stop()?
Risposta: Il timer non deve essere immediatamente ripristinato senza aver chiamato Stop() e senza aver potenzialmente letto dal canale. Se non si chiama t.Stop(), potrebbe rimanere una goroutine "morta" o un trigger imprevisto nel ciclo successivo (il canale non è stato svuotato). Utilizzo corretto: chiama Stop(), e se Stop() restituisce false — assicurati di svuotare il canale leggendo da t.C.
Storia
Storia
Ticker per gli aggiornamenti periodici del prodotto, che non veniva arrestato al termine dell'handler. L'handler "rimaneva" anche dopo che l'utente era stato rimosso, continuando a consumare CPU.Storia
Nei test non veniva chiamato Stop() per il timer — i test si bloccavano in modo casuale perché il canale del timer non veniva liberato, si aspettava un secondo "ping" dal timer, che non arrivava mai.