Menu
Coddy logo textTech

Sospensioni e ticker

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

A volte devi controllare i tempi di esecuzione del tuo programma. Go fornisce due funzioni essenziali nel pacchetto time a questo scopo: 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 time.Duration come parametro e blocca l'esecuzione finché non è trascorso quel periodo:

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 le 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 sessioni di meditazione che utilizzi time.Sleep per creare pause tra le istruzioni guidate e dimostri il controllo temporale di base 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 dividendolo in corrispondenza delle virgole per ottenere i singoli passaggi di meditazione
  2. Per ogni passaggio, dividerlo in corrispondenza dei due punti per estrarre l’istruzione e la durata (in secondi)
  3. Convertire le stringhe delle durate in interi utilizzando il pacchetto strconv
  4. Convertire il secondo input in un intero per ottenere il numero di cicli
  5. Visualizzare l’intestazione della sessione: "=== MEDITATION TIMER ==="
  6. Visualizzare la configurazione 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]..."
      • Utilizzare time.Sleep per mettere in pausa l’esecuzione per la durata specificata (convertire i secondi in time.Duration moltiplicandoli per time.Second)
      • 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" (la somma delle durate di tutti i passaggi moltiplicata per il numero di cicli)
  9. Visualizzare il messaggio di completamento: "Meditation session finished - well done!"

Utilizza il pacchetto time per le operazioni di pausa, il pacchetto strings per dividere le stringhe di input, il pacchetto strconv per convertire le stringhe in interi e il pacchetto fmt per l’output. Ricorda che time.Sleep accetta un parametro time.Duration, quindi devi moltiplicare i secondi interi per time.Second per creare un valore di durata appropriato. Questa sfida mostra come utilizzare time.Sleep per creare pause temporizzate durante l’esecuzione di un programma, in 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 della meditazione e i cicli
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Scrivi il tuo codice qui sotto
	// Analizza ogni passaggio per ricavare l'istruzione e la durata
	// Ricorda di verificare che lo slice parts contenga abbastanza elementi prima di accedervi
	// Mostra l'intestazione della sessione e le informazioni iniziali
	// Scorri i cicli e i passaggi
	// Usa time.Sleep per le pause (valuta l'uso dei millisecondi per i test)
	// 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