Menu
CoddyTech

Sospensioni e ticker

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 64 di 68.

A volte è necessario controllare i tempi di esecuzione del programma. Go fornisce due funzioni essenziali nel pacchetto time per farlo: time.Sleep per mettere in pausa l'esecuzione e time.NewTicker per eseguire azioni a intervalli regolari.

La funzione time.Sleep mette in pausa il programma per una durata specificata. Accetta un valore time.Duration come parametro e blocca l'esecuzione finché non è trascorso quel tempo:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

Per azioni ripetute a intervalli regolari, time.NewTicker crea un ticker che invia valori su un canale a intervalli specificati. È utile per attività che devono essere eseguite periodicamente:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Attendi il prossimo tick
    fmt.Println("Tick", i+1)
}

Queste funzioni di temporizzazione sono essenziali per creare ritardi, implementare timeout e pianificare operazioni ricorrenti nei tuoi programmi Go.

challenge icon

Sfida

Facile

Crea un timer per una sessione di meditazione che usa time.Sleep per creare pause tra le istruzioni guidate e dimostra il controllo di base della temporizzazione nei programmi Go.

Riceverai due input:

  • Una stringa contenente i passaggi di meditazione nel formato "step1:duration,step2:duration,step3:duration" (ad es., "Breathe in:3,Hold:2,Breathe out:4")
  • Una stringa contenente il numero di cicli da ripetere (ad es., "5")

Il tuo compito è:

  1. Analizzare il primo input suddividendolo in corrispondenza delle virgole per ottenere i singoli passaggi di meditazione
  2. Per ogni passaggio, suddividerlo in corrispondenza dei due punti per estrarre l'istruzione e la durata (in secondi)
  3. Convertire le stringhe delle durate in numeri interi usando il pacchetto strconv
  4. Convertire il secondo input in un numero intero per ottenere il numero di cicli
  5. Visualizzare l'intestazione della sessione: "=== MEDITATION TIMER ==="
  6. Visualizzare l'avvio della sessione: "Starting meditation session with [number_of_cycles] cycles"
  7. Per ogni ciclo (a partire dal ciclo 1):
    • Visualizzare: "--- Cycle [cycle_number] ---"
    • Per ogni passaggio di meditazione:
      • Visualizzare: "[instruction]..."
      • Usare time.Sleep per fare una pausa della durata specificata (moltiplicare la durata per time.Millisecond, come in time.Duration(duration) * time.Millisecond, in modo che i controlli terminino rapidamente; l'output indica comunque i secondi)
      • Dopo la pausa, visualizzare: "[instruction] complete ([duration] seconds)"
    • Dopo aver completato tutti i passaggi di un ciclo, visualizzare: "Cycle [cycle_number] finished"
  8. Dopo aver completato tutti i cicli, visualizzare il riepilogo della sessione:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (somma delle durate di tutti i passaggi moltiplicata per il numero di cicli)
  9. Visualizzare il messaggio di completamento: "Meditation session finished - well done!"

Usa il pacchetto time per le operazioni di pausa, il pacchetto strings per suddividere le stringhe di input, il pacchetto strconv per convertire le stringhe in numeri interi e il pacchetto fmt per l'output. Ricorda che time.Sleep accetta un parametro time.Duration, quindi converti prima il numero intero: time.Duration(duration) * time.Millisecond. Un timer reale userebbe time.Second, ma le pause di secondi interi causerebbero il timeout dei controlli. Questa sfida dimostra come usare time.Sleep per creare pause temporizzate durante l'esecuzione del programma, per applicazioni pratiche come i timer per la meditazione guidata o per l'esercizio fisico.

Provalo tu

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Leggi l'input usando bufio.Scanner per gestire correttamente gli spazi
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Analizza i passaggi e i cicli della meditazione
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Scrivi il tuo codice qui sotto
	// Analizza ogni passaggio per estrarre l'istruzione e la durata
	// Ricorda di verificare che la slice parts contenga abbastanza elementi prima di accedervi
	// Mostra l'intestazione della sessione e la configurazione
	// Itera sui cicli e sui passaggi
	// Usa time.Sleep per le pause: time.Duration(duration) * time.Millisecond
	// Mostra i messaggi di completamento e il riepilogo
	
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online